执行mvn clean install时JUnit4测试用例不运行,但单独运行正常
Maven执行
mvn clean install时JUnit4测试无法运行,手动运行正常 我用JUnit4开发Spring Boot项目,执行mvn clean install时测试用例跑不起来,但项目编译没问题;右键单独运行JUnit测试用例却能成功执行。我已经在src/test/java下手动创建了包,还删了Maven初始化时默认生成的测试类,想问下是不是需要在pom.xml里指定测试包?
提供的配置与代码
pom.xml配置
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <!-- NOT org.junit here --> <artifactId>junit-dep</artifactId> <version>4.8.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20171018</version> <exclusions> <exclusion> <groupId>com.vaadin.external.google</groupId> <artifactId>android-json</artifactId> </exclusion> </exclusions> </dependency> <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.14.3</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.8</version> </dependency> <dependency> <groupId>org.springframework.ldap</groupId> <artifactId>spring-ldap-core</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-ldap</artifactId> </dependency> <dependency> <groupId>com.unboundid</groupId> <artifactId>unboundid-ldapsdk</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.5.9</version> </dependency> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.opencsv/opencsv --> <dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.4</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.18.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.6.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-freemarker --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> <version>2.6.2</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <testSourceDirectory>${project.basedir}/src/test/java</testSourceDirectory> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.3</version> <executions> <execution> <id>prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>prepare-package</phase> <goals> <goal>report</goal> </goals> </execution> <execution> <id>post-unit-test</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>3.1.2</version> <configuration> <from> <image>openjdk:11.0.9.1-jdk</image> </from> <to> <image>${docker.registry.baseurl}/${project.artifactId}:${docker.tag}</image> </to> <container> <creationTime>USE_CURRENT_TIMESTAMP</creationTime> </container> </configuration> </plugin> </plugins> </build> </project>
测试用例代码
import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.when; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest @EnableAutoConfiguration public class MyControllerTest { @Mock MyService myService; @InjectMocks private MyController myController; @Test public void testPostData() { when(myService.postLRAData()).thenReturn(" Data saved to DB successfully!!"); ResponseEntity<String> response = new ResponseEntity<String>("Data saved to DB successfully!!", HttpStatus.CREATED); assertEquals(response, myController.postLRAData()); } }
项目结构
测试代码位于src/test/java下手动创建的包中,已删除Maven初始化默认生成的测试类。
问题排查与解决方案
1. 无需手动指定测试包
Maven默认会扫描src/test/java下所有符合命名规范的测试类(通常以*Test.java结尾),你的测试类MyControllerTest符合要求,所以不需要额外在pom.xml中指定测试包路径。
2. 核心问题:JUnit依赖冲突
你的pom.xml中同时引入了spring-boot-starter-test和junit-dep,这会导致依赖冲突:
spring-boot-starter-test已经包含了JUnit4的完整依赖(org.junit:junit)- 手动添加的
junit:junit-dep:4.8.2是旧版本的拆分依赖包,会和starter中的JUnit版本冲突,导致Maven Surefire插件无法识别测试类。
解决方法:
删除junit-dep的依赖,保留spring-boot-starter-test即可,它已经包含了Spring Boot测试所需的所有依赖(JUnit4、Mockito、Spring Test等)。
修改后的依赖片段:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
3. 其他优化建议
- 移除测试类上的
@EnableAutoConfiguration:@SpringBootTest已经包含了自动配置的功能,无需重复添加。 - 可选:给Surefire插件添加扫描规则,确保测试类被识别:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> <configuration> <includes> <include>**/*Test.java</include> </includes> </configuration> </plugin>
4. 验证步骤
修改后先执行mvn clean test单独运行测试阶段,确认测试用例正常执行后,再执行mvn clean install即可。
内容的提问来源于stack exchange,提问作者Madan Mohan Mishra
相关产品推荐
相关产品推荐

