Spring Boot升级后单元测试不生效

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实现的单元测试失效了。
Spring Boot升级后单元测试不生效_第1张图片
2.3.12.RELEASE版本依赖:
Spring Boot升级后单元测试不生效_第2张图片
2.6.7版本依赖:
Spring Boot升级后单元测试不生效_第3张图片

解决方案

大概有两种解决方法,本次采用的是第一种。

方案一

方案一最简单,如果想继续使用JUnit4注解,可以将junit-vintage-engine依赖重新添加回来。具体依赖如下:


<dependency>
  <groupId>org.junit.vintagegroupId>
  <artifactId>junit-vintage-engineartifactId>
  <scope>testscope>
  <exclusions>
    <exclusion>
      <groupId>org.hamcrestgroupId>
      <artifactId>hamcrest-coreartifactId>
    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

https://www.baeldung.com/junit-5

https://howtodoinjava.com/junit5/junit-5-vs-junit-4

你可能感兴趣的:(SpringBoot,单元测试,spring,boot,java)