Spring Boot升级后单元测试不生效
背景
升级了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的差异的文章,我这边也参考贴一下,主要是一些注解的切换。
FeatureJUnit 4Junit 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
版权归原作者 洒脱的智障 所有, 如有侵权,请联系我们删除。