Maven项目中RandomGeneratorServiceImplTest测试类无法执行的问题排查与解决
Maven测试类无法执行问题解决
问题现象
- 项目目录结构:

- 执行
mvn test命令时,仅运行3个测试类:- SocialMultiplicationApplicationTests
- MultiplicationServiceTest
- RandomGeneratorServiceTest
- 单独执行
RandomGeneratorServiceImplTest时,运行命令mvn test -Dtest=RandomGeneratorServiceImplTest出现报错:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test (default-test) on project social-multiplication: No tests were executed! (Set -DfailIfNoTests=false to ignore this error.) -> [Help 1]
项目pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>microservices.book</groupId> <artifactId>social-multiplication</artifactId> <version>0.0.1-SNAPSHOT</version> <name>social-multiplication</name> <description>Social Multiplication App</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
无法运行的测试类代码
package microservices.book.multiplication.service; import static org.assertj.core.api.Assertions.assertThat; import org.junit.Before; import org.junit.Test; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; public class RandomGeneratorServiceImplTest { private RandomGeneratorServiceImpl randomGeneratorServiceImp; @Before public void setUp(){ randomGeneratorServiceImp = new RandomGeneratorServiceImpl(); } @Test public void generateRandomFactorIsBetweenExpectedLimits() { List<Integer> randomFactors = IntStream.range(0,1000) .map(i -> randomGeneratorServiceImp.generateRandomFactor()) .boxed() .collect(Collectors.toList()); for(Integer i: randomFactors){ assertThat(i).isIn( IntStream.range(11, 100). boxed().collect(Collectors.toList())); } } }
问题根源与解决方案
问题根源
项目依赖同时引入了JUnit4和JUnit5,导致测试引擎冲突,Maven Surefire插件无法识别JUnit4风格的测试类。
解决方案
将测试类迁移至JUnit5规范:
- 替换
@Before注解为@BeforeAll - 在测试类上添加
@TestInstance(Lifecycle.PER_CLASS)注解
修改后的测试类代码:
package microservices.book.multiplication.service; import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; @TestInstance(Lifecycle.PER_CLASS) public class RandomGeneratorServiceImplTest { private RandomGeneratorServiceImpl randomGeneratorServiceImp; @BeforeAll public void setUp(){ randomGeneratorServiceImp = new RandomGeneratorServiceImpl(); } @Test public void generateRandomFactorIsBetweenExpectedLimits() { List<Integer> randomFactors = IntStream.range(0,1000) .map(i -> randomGeneratorServiceImp.generateRandomFactor()) .boxed() .collect(Collectors.toList()); for(Integer i: randomFactors){ assertThat(i).isIn( IntStream.range(11, 100). boxed().collect(Collectors.toList())); } } }
内容的提问来源于stack exchange,提问作者IDK
相关产品推荐
相关产品推荐

