Java 9+、Cucumber与JUnit5在非Spring应用中的执行问题排查
Maven+JUnit5+Cucumber+JDK18模块集成测试执行失败(测试数为0)
问题背景
查阅Cucumber文档并大量搜索资料后,仍在Maven、Java、JUnit5、Cucumber及Java模块集成(基于JDK18)的问题上受阻。现有一个简单Java桌面应用,尝试通过Maven借助Surefire插件执行Cucumber的feature测试,Java模块无“非法访问”错误,但测试始终无法执行。
执行现象
运行mvn test后,Surefire输出显示无测试执行:
--- maven-surefire-plugin:3.0.0-M7:test (default-test) @ usecasetdd --- [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] [INFO] Results: [INFO] [INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 [INFO]
现有配置
1. Cucumber引导类
package com.demodemo.core.tests; //... @Suite @IncludeEngines("cucumber") @SelectClasspathResource("com/demodemo/core/tests/features") @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "com.demodemo.core.tests") class GameBDDTests { }
2. 项目结构

解决方法
1. 修改引导类访问权限
默认包访问权限的测试类可能无法被JUnit 5扫描识别,将GameBDDTests改为public:
public class GameBDDTests { }
2. 升级Surefire插件版本
3.0.0-M7为旧版测试插件,升级至稳定版(如3.2.5)确保兼容性:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> </plugin>
3. 统一Cucumber依赖版本
确保cucumber-junit-platform-engine、cucumber-java等依赖版本一致,且适配JUnit 5版本(示例使用Cucumber 7.x):
<dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>7.15.0</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit-platform-engine</artifactId> <version>7.15.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-suite</artifactId> <version>1.10.0</version> <scope>test</scope> </dependency>
4. 验证feature文件配置
确认feature文件扩展名为.feature,且文件内包含合法的Cucumber语法(如Scenario定义),同时@SelectClasspathResource路径与实际资源路径完全匹配。
5. 完善模块描述符配置
模块化项目需在module-info.java中声明依赖并开放测试包权限:
module com.demodemo.core { requires io.cucumber.java; requires io.cucumber.junit.platform.engine; requires org.junit.platform.suite.api; requires org.junit.jupiter.api; opens com.demodemo.core.tests to io.cucumber.java, org.junit.platform.commons; }
6. 指定测试类执行排查
通过命令直接指定测试类,验证是否能被识别:
mvn test -Dtest=GameBDDTests
若执行成功,需在Surefire插件中明确测试类匹配规则:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <configuration> <includes> <include>**/*Tests.java</include> </includes> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者McGivrer
相关产品推荐
相关产品推荐

