我有一个可以通过测试的类,如果我在詹金斯之外的单独的Java类中调用它,则运行。它的构造函数有:
this.fs = FileSystems.getDefault();
稍后执行时,我在看到一个空指针异常后添加了理智检查。
if (this.fs == null) {
throw new Exception("No FileSystem found");
}
因此,当此插件在jenkins中运行时,默认的FileSystem
为null
,并且抛出了例外。我的原始代码使用了Paths.get
,但我将其切换为this.fs.getPath(stringPath);
,因此我可以使用DI创建用于单位测试的FileSystem
。
使用Paths.get
在重构之前的工作正常,但是我不确定使用该方法如何知道正确的FileSystem
,尤其是在此环境中似乎没有设置默认值。
从未听说过这样的问题。听起来您的环境被严重破坏,因为这是由Java平台定义的。尝试分一分 - 插入插件的非临界部分,直到找出触发问题的是。
使用System.out
后,我意识到构造函数未在插件更新上运行。保存作业配置时确实运行。因此,当我保存作业配置时,通过副作用解决了我的问题。我最初不是设置this.fs
,因此更新插件没有运行这些新行。因此,我不应该将不用于配置的构造函数放入构造函数中。事后看来,这很有意义,因为它确实是一个@DataBoundConstructor
,这意味着它用于来自config的数据。