SpringBoot整合JUnit5
前言
JUnit5是Java的测试框架,可以帮助Java程序员对自己编写的代码进行测试,使用起来比较友好。借用JUnit5官网上一句话来说:The 5th major version of the programmer-friendly testing framework for Java and the JVM
本次就来简单总结下JUnit5的基本用法
链接: 官网地址
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
常用注解
● @Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试
● @RepeatedTest :表示方法可重复执行
● @DisplayName :为测试类或者测试方法设置展示名称
● @BeforeEach :表示在每个单元测试之前执行
● @AfterEach :表示在每个单元测试之后执行
● @BeforeAll :表示在所有单元测试之前执行
● @AfterAll :表示在所有单元测试之后执行
● @Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
● @Timeout :表示测试方法运行如果超过了指定时间将会返回错误
● @ExtendWith :为测试类或测试方法提供扩展类引用
@DisplayName
package com.gavin.boot;
import org.junit.jupiter.api.*;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
}
}
运行结果
@BeforeEach
package com.gavin.boot;
import org.junit.jupiter.api.*;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
}
@BeforeEach
void testBeforeEach() {
System.out.println("开始测试了。。。");
}
}
运行结果
@AfterEach
package com.gavin.boot;
import org.junit.jupiter.api.*;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
}
@BeforeEach
void testBeforeEach() {
System.out.println("开始测试了。。。");
}
@AfterEach
void testAfterEach() {
System.out.println("测试已经结束了。。。");
}
}
运行结果
@BeforeAll
package com.gavin.boot;
import org.junit.jupiter.api.*;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
}
@Test
@DisplayName("第二次测试")
void secondTest() {
System.out.println(2);
}
@BeforeEach
void testBeforeEach() {
System.out.println("开始测试了。。。");
}
@AfterEach
void testAfterEach() {
System.out.println("测试已经结束了。。。");
}
@BeforeAll
static void testBeforeAll() {
System.out.println("所有的开始测试了。。。");
}
}
运行结果
@AfterAll
package com.gavin.boot;
import org.junit.jupiter.api.*;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
}
@Test
@DisplayName("第二次测试")
void secondTest() {
System.out.println(2);
}
@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("所有的测试已经结束了...");
}
}
运行结果
@Timeout
package com.gavin.boot;
import org.junit.jupiter.api.*;
import java.util.concurrent.TimeUnit;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
}
@Test
@DisplayName("第二次测试")
void secondTest() {
System.out.println(2);
}
@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("所有的测试已经结束了...");
}
@Test
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
void testTimeout() throws InterruptedException {
Thread.sleep(600);
}
}
运行结果
可以看出,如果方法执行的时间超过测试设置的时间就会报错
@Disabled
package com.gavin.boot;
import org.junit.jupiter.api.*;
import java.util.concurrent.TimeUnit;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
}
@Test
@DisplayName("第二次测试")
void secondTest() {
System.out.println(2);
}
@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("所有的测试已经结束了...");
}
@Test
@Disabled
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
void testTimeout() throws InterruptedException {
Thread.sleep(600);
}
}
运行结果
可以看出,testTimeout()方法加上了@Disabled这个注解后,这个方法就没有执行了,就不会有报错了
@ExtendWith
如果我们想使用RedisTemplate,我就在类中注入RedisTemplate
package com.gavin.boot;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Autowired
private RedisTemplate redisTemplate;
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
System.out.println(redisTemplate);
}
}
运行结果
可以看出,RedisTemplate 并没有被注入到容器中,如果需要主要到spring容器中,就需要添加@SpringBootTest
package com.gavin.boot;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Autowired
private RedisTemplate redisTemplate;
@Test
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
System.out.println(redisTemplate);
}
}
运行结果
可以看出,RedisTemplate已经被注入到spring容器中
那为什么加了@SpringBootTest注解RedisTemplate就可以注入到spring容器中呢?我们点进@SpringBootTest注解看一下源码就知道了
可以看出,源码中也是添加了@ExtendWith注解,才能把@Autowired的类注入到spring容器中,这就是@ExtendWith注解的基本用法了
@RepeatedTest
package com.gavin.boot;
import org.junit.jupiter.api.*;
@DisplayName("JUnit5功能测试类")
public class Junit5 {
@Test
@RepeatedTest(value = 5)
@DisplayName("第一次测试")
void firstTest() {
System.out.println(1);
}
}
运行结果
可以看出方法运行了5次
总结
以上就是JUnit5中基本注解的用法,其它注解以后有时间再继续更新。