用例读数据写的是 D:\work\demo\src\test\resources\orders.json,换到 CI 报 FileNotFoundException,那台机器根本没有 D 盘。日志里能对上时间点,这种反而好排。
绝对路径绑定了开发机的目录结构,构建机上不存在。资源文件在测试期应该从 classpath 取,而不是从磁盘位置取。这一点先确认清楚,后面就不用反复试。
InputStream in = getClass().getResourceAsStream("/orders.json");
Objects.requireNonNull(in, "orders.json not found");
围绕「测试资源路径」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
处理上按这个顺序:改用 getResourceAsStream 从 classpath 读 路径以斜杠开头;资源放 src/test/resources 跟着构建走;确实要外部文件就通过系统属性传入 并给默认值;CI 上跑一次 确认没有残留盘符。
结果对不对很好判断,本地和 CI 都能读到同一份 orders.json 日志里的路径不再带盘符。
