Yuandupier

Yuandupier

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

38
0
0
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的差异的文章,我这边也参考贴一下,主要是一些注解的切换。

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

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

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