Maven集成测试启动Jetty遇空指针且未执行测试求助
咱们把问题拆成两个核心部分来处理:Jetty启动时触发的空指针异常,以及maven-failsafe-plugin未执行测试的问题,一步步来解决:
一、修复Jetty启动时的NullPointerException
从堆栈信息能看到,空指针出现在nl.nn.adapterframework.util.Misc.getBuildOutputDirectory()方法里,这说明Ibis框架的Misc类在尝试获取构建输出目录时,找不到必要的系统属性。结合你的Jetty配置,问题根源是缺少Maven构建相关的系统属性传递,导致框架无法定位项目基础目录和构建输出目录。
解决步骤:
在Jetty插件的<systemProperties>节点中,添加两个Maven内置的系统属性:
<systemProperty> <name>basedir</name> <value>${project.basedir}</value> </systemProperty> <systemProperty> <name>project.build.directory</name> <value>${project.build.directory}</value> </systemProperty>
这两个属性会把Maven的项目根目录和构建输出目录(默认是target)传递给Jetty,让Misc类能正确获取路径,避免空指针异常。
另外,日志里提到找不到DeploymentSpecifics.properties,你需要确认这个配置文件是否存在于src/main/resources目录下,如果缺失,得补充这个文件,消除启动警告。
二、让maven-failsafe-plugin执行测试
你的测试类ChromeTestIT.java符合*IT.java的命名规范,但测试没执行,可能有以下几个原因,逐一排查:
1. 确保测试目录被Maven识别
你的测试文件放在webapp\src\test\java\nl\nn\adapterframework\webcontrol\api,默认情况下Maven会自动识别src/test/java作为测试源目录,但如果是多模块项目,可能需要明确配置:
<build> <testSourceDirectory>src/test/java</testSourceDirectory> </build>
2. 完善failsafe插件的配置
虽然你配置了阶段执行,但可以添加<includes>明确指定测试类的匹配规则,确保插件能找到你的测试文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>2.20.1</version> <executions> <execution> <id>integration-test</id> <goals> <goal>integration-test</goal> </goals> <configuration> <includes> <include>**/*IT.java</include> </includes> </configuration> </execution> <execution> <id>verify</id> <goals> <goal>verify</goal> </goals> </execution> </executions> </plugin>
3. 确保Jetty真正启动成功
日志里显示Jetty启动成功,但实际上ConfigurationServlet初始化失败,应用上下文并没有正确加载。解决完第一个空指针问题后,Jetty才能真正把应用跑起来,这时failsafe插件才会在integration-test阶段执行测试。
三、额外优化建议
- 升级Jetty插件版本:你当前用的Jetty 9.0.7版本比较老旧,建议升级到9.4.x系列的稳定版本,能避免一些潜在的兼容性问题。
- 检查Selenium依赖:确认
ChromeTestIT.java里的ChromeDriver配置正确,并且pom.xml中已经添加了Selenium的相关依赖。
修改完配置后,执行mvn clean verify重新测试,看看空指针是否消失,同时确认failsafe插件是否开始执行你的Selenium测试。
内容的提问来源于stack exchange,提问作者Laurens Mäkel

