Java Cucumber测试中Maven随机端口获取为null的问题咨询
问题解决:让Cucumber测试获取build-helper分配的随机端口
是的,你需要在surefire插件中额外配置,把build-helper生成的端口属性传递给测试JVM的系统属性,否则Cucumber步骤里拿不到对应值。
问题原因
build-helper-maven-plugin的reserve-network-port目标生成的是Maven构建属性(仅在Maven构建生命周期内可见),并不会自动成为测试JVM的系统属性,所以你的测试代码通过System.getProperty()获取时会返回null。
解决方案
修改maven-surefire-plugin的配置,在systemPropertyVariables节点中添加这两个端口属性,直接引用Maven生成的变量:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.20</version> <executions> <execution> <id>cucumber-tests</id> <phase>integration-test</phase> <goals> <goal>test</goal> </goals> <configuration> <systemPropertyVariables> <log.dir>${project.build.directory}/logs</log.dir> <!-- 添加这两行,把Maven属性映射为系统属性 --> <kafka.port>${kafka.port}</kafka.port> <service.port>${service.port}</service.port> </systemPropertyVariables> <includes> <include>**/*Test.java</include> <include>**/*Steps.java</include> <excludes>**/*cucumber.RunCucumberIT.java</excludes> </includes> <testFailureIgnore>false</testFailureIgnore> </configuration> </execution> </executions> </plugin>
原理说明
通过上述配置,surefire插件在启动测试JVM时,会把Maven中已生成的kafka.port和service.port属性值,注入为测试环境的系统属性,这样你的Cucumber步骤代码System.getProperty("service.port")就能正确获取到随机分配的端口值了。
内容的提问来源于stack exchange,提问作者paul
相关产品推荐
相关产品推荐

