Spring Boot升级后单元测试不生效
编辑2022-06-08
背景
升级了Spring Boot到2.6.7版本之后,DT流水线没有跑过,查看CI日志应该是没有识别到单元测试用例,所有的单元测试都没有执行。本地执行mvn package命令的时候也没有跑单元测试。
问题原因
升级之前,项目使用的JUnit版本是4.13.2,spring-boot-starter-test的版本是2.3.12.RELEASE。是基于JUnit4的单元测试。Google一下,参考了部分文档,发现应该是升级了Spring Boot之后,在Spring Boot 2.4版本开始,junit-vintage-engine这个依赖已经从spring-boot-starter-test中移除了,而junit-vintage-engine这个依赖提供了在JUnit 5平台上运行JUnit3和JUnit4用例的支持。所以升级之后,我们使用的基于JUnit4实现的单元测试失效了。 2.3.12.RELEASE版本依赖: 2.6.7版本依赖:
解决方案
大概有两种解决方法,本次采用的是第一种。
方案一
方案一最简单,如果想继续使用JUnit4注解,可以将junit-vintage-engine依赖重新添加回来。具体依赖如下:
<!--适配spring boot升级 解决单元测试不生效的问题 -->
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
添加完成之后,单元测试生效,问题解决。
方案二
第二种方案就是切换到JUnit5,毕竟Spring Boot官方也已经将JUnit4支持的引擎依赖排除了,这边网上有很多关于JUnit4和JUnit5的差异的文章,我这边也参考贴一下,主要是一些注解的切换。
Feature | JUnit 4 | Junit 5 |
---|---|---|
声明一个测试方法(注解相同,类路径变化) | @Test | @Test |
在当前类中的所有测试方法之前执行 | @BeforeClass | @BeforeAll |
在当前类中的所有测试方法之后执行 | @AfterClass | @AfterAll |
在每个测试方法之前执行 | @Before | @BeforeEach |
在每个测试方法之后执行 | @After | @AfterEach |
禁用测试方法/类 | @Ignore | @Disabled |
动态测试的测试工厂 | NA | @TestFactory |
嵌套测试 | NA | @Nested |
标记和过滤 | @Category | @Tag |
注册自定义扩展 | NA | @ExtendWith |
替换部分注解之后,单元测试同样生效,问题解决。不过这种方法需要所有的单元测试用例,我们项目的工程比较多,就暂时没有采用,后续会考虑切换。
参考
https://www.baeldung.com/spring-boot-testing