Maven中test与java目录间存在子目录时如何正常执行测试
问题根因
Maven默认的测试源码扫描根路径为src/test/java,在test目录和java目录之间新增demo中间目录后,实际测试源码路径变为src/test/demo/java,不在maven-compiler-plugin、maven-surefire-plugin的默认扫描范围内,因此会出现测试阶段无源码可编译、无测试用例可执行的问题,后续Cucumber报告插件因为拿不到测试生成的结果文件,自然会抛出异常。
修复步骤
核心是修改Maven内置的测试源码路径变量,不需要引入第三方路径辅助插件,直接在项目pom.xml中显式指定调整后的测试源码路径即可,不需要修改其他业务代码或测试代码:
- 首先在
<build>节点下声明新的测试源码根目录,这是Maven原生支持的配置项:
<build> <!-- 指向调整后的测试java文件根目录 --> <testSourceDirectory>${project.basedir}/src/test/demo/java</testSourceDirectory> <!-- 如果你的测试资源文件(比如Cucumber的feature文件、配置文件)也同步挪到了src/test/demo/resources目录下,就补充下面的配置,没挪位置就不需要加 --> <!-- <testResources> <testResource> <directory>${project.basedir}/src/test/demo/resources</directory> </testResource> </testResources> --> <plugins> <!-- 原有maven-compiler-plugin 3.10.0配置保留即可,插件会自动读取上面配置的testSourceDirectory路径编译测试源码,不需要额外修改参数 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.0</version> <!-- 你之前配置的source/target/编码等参数全部保留 --> </plugin> <!-- 原有maven-surefire-plugin 3.0.0-M5补充路径关联配置,确保测试扫描路径和源码路径一致 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M5</version> <configuration> <testSourceDirectory>${project.testSourceDirectory}</testSourceDirectory> <!-- 保持原有的测试匹配规则即可,默认会扫描命名符合*Test.java、*IT.java的测试类、Cucumber启动类 --> </configuration> </plugin> <!-- 原有Cucumber报告插件配置不需要修改,测试正常执行生成结果文件后,就不会再抛出文件不存在的异常 --> </plugins> </build>
验证方式
配置修改完成后,先执行mvn clean test-compile命令,查看控制台输出的测试类编译数量,确认所有测试类都被正常编译后,再执行mvn clean install即可完整走通测试执行、报告生成的全流程。
注意:如果是多模块项目,上述路径配置要写在对应模块的pom.xml中,确保相对路径和模块实际目录结构匹配,不要写错层级。
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

