1.相关介绍
Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库, JUnit 5官方文档
作为最新版本的JUnit框架,JUnit5与之前版本的JUnit框架有很大的不同。由三个不同子项目的几个不同模块组成。
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
- JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。
- JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在Junit Platform上运行。
- JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,JUnit3.x的测试引擎。
2.整合方法
- 使用添加JUnit 5,添加对应的starter, 在pom.xml文件中添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
注意:
- SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖。如果需要兼容JUnit4需要自行引入(不能使用JUnit4的功能 @Test)
- JUnit 5’s Vintage已经从spring-boot-starter-test从移除。如果需要继续兼容Junit4需要自行引入Vintage依赖:(不使用JUnit4可忽略)
<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>
Spring的JUnit 5的基本单元测试模板(Spring的JUnit4的是@SpringBootTest+@RunWith(SpringRunner.class)):
package com.limi.springboottest2;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class JTest5 {
@Test
public void test1(){
System.out.println("123456");
}
}
3.常用注解
- @Test:表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试
- @ParameterizedTest:表示方法是参数化测试。
- @RepeatedTest:表示方法可重复执行。
- @DisplayName:为测试类或者测试方法设置展示名称。
- @BeforeEach:表示在每个单元测试之前执行。
- @AfterEach:表示在每个单元测试之后执行。
- @BeforeAll:表示在所有单元测试之前执行。
- @AfterAll:表示在所有单元测试之后执行。
- @Tag:表示单元测试类别,类似于JUnit4中的@Categories。
- @Disabled:表示测试类或测试方法不执行,类似于JUnit4中的@Ignore。
- @Timeout:表示测试方法运行如果超过了指定时间将会返回错误。
- @ExtendWith:为测试类或测试方法提供扩展类引用。
4.运行测试
JTest5
package com.limi.springboottest2;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.concurrent.TimeUnit;
@DisplayName("junit5功能测试类")
@SpringBootTest
public class JTest5 {
@DisplayName("测试displayname注解")
@Test
public void test1(){
System.out.println("1");
}
//传入指定参数
@ParameterizedTest
@ValueSource(strings = {"参数1", "参数2"})
public void test2(String str){
System.out.println("2");
System.out.println(str);
}
//当运行整个测试类时, 该方法不会被执行
@Disabled
@Test
public void test3(){
System.out.println("3");
}
//当运行整个测试类时, 该方法会被重复执行3次
@RepeatedTest(3)
@Test
public void test4(){
System.out.println("4");
}
//测试方法执行超出设置的时间, 抛出依次
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
@Test
public void test5(){
System.out.println("5");
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void test6(){
System.out.println("6");
}
//每一个测试方法执行前都会触发该方法
@BeforeEach
void testBeforeEach() {
System.out.println("有一个测试就要开始了...");
}
//每一个测试方法执行完成后都会触发该方法
@AfterEach
void testAfterEach() {
System.out.println("有一个测试测试结束了...");
}
//当执行整个测试类时, 在第一个测试方法执行前会触发该方法
@BeforeAll
static void testBeforeAll() {
System.out.println("所有测试就要开始了...");
}
//当执行测试类时, 所有测试方法执行完成后会触发该方法
@AfterAll
static void testAfterAll() {
System.out.println("所有测试以及结束了...");
}
}
注意:网络不好执行测试可能会报错:Failed to resolve org.junit.platform:junit-platform-launche