如何在Maven Tycho构建中运行标准JUnit测试?
完全可行,你可以在Tycho多模块项目中新增一个普通Maven Java模块,脱离OSGi环境用maven-surefire-plugin运行标准JUnit测试。针对你遇到的“No tests to run.”问题,需要注意以下几个关键事项:
模块类型与POM配置
这个测试模块必须设置为普通的<packaging>jar</packaging>,不能使用Tycho专属的eclipse-plugin或eclipse-test-plugin打包类型。同时要移除POM中所有Tycho相关的配置,比如继承自Tycho父POM的设置、tycho-maven-plugin的引用等,确保Maven用标准Java项目生命周期处理该模块。测试类命名规则
maven-surefire-plugin默认只识别符合特定命名模式的测试类:- 类名以
Test结尾(如UserServiceTest.java) - 类名以
Test开头(如TestUserService.java) - 类名包含
TestCase(如UserServiceTestCase.java)
如果你的测试类不符合上述规则,需要在插件配置中显式指定匹配规则,示例如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.5</version> <!-- 使用对应版本 --> <configuration> <includes> <include>**/*CustomTest.java</include> <!-- 自定义匹配规则 --> </includes> </configuration> </plugin>- 类名以
JUnit依赖与插件兼容性
确保引入的JUnit依赖和maven-surefire-plugin版本兼容:- 若使用JUnit 4,需引入
junit:junit依赖,插件版本可选择2.x系列 - 若使用JUnit 5,需引入
org.junit.jupiter:junit-jupiter-api和org.junit.jupiter:junit-jupiter-engine,插件版本需用3.0.0及以上
注意不要使用Tycho环境中OSGi化的JUnit依赖(如org.junit:org.junit),必须使用Maven中央仓库提供的标准JUnit包。
- 若使用JUnit 4,需引入
跨模块依赖处理
如果测试需要依赖Tycho项目中的其他模块,不能直接依赖eclipse-plugin类型的bundle模块——普通Maven模块无法识别OSGi bundle的依赖结构。建议将被测试的核心代码抽离为一个普通的<packaging>jar</packaging>模块,让Tycho插件模块和测试模块同时依赖这个普通jar模块;若无法抽离,可通过tycho-p2-plugin将OSGi bundle导出为普通jar,但这种方式配置复杂,优先推荐代码抽离方案。正确执行Maven命令
运行测试时需执行标准Maven命令,比如mvn test或mvn verify,不要使用Tycho专属的mvn tycho:test命令,后者只会处理Tycho类型的测试模块。
内容的提问来源于stack exchange,提问作者user3726374

