1、基于SpringBoot2.7版本,引入单元测试组件
org.springframework.boot
spring-boot-starter-test
test
详细组件介绍
Junit4和Junit5的区别
Junit 5 = Junit Platform + Junit Jupiter + Junit Vintage
Junit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。
Junit Jupiter: Junit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部 包含了一个测试引擎,用于在Junit Platform上运行。
Junit Vintage: 由于JUnit已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎。
Junit4的依赖
Junit5
org.junit.jupiter
junit-jupiter-engine
5.9.2
test
org.junit.jupiter
junit-jupiter
5.9.2
test
SpringBoot框架引入
1、注解对比
junit4 | junit5 | 特点 |
---|---|---|
@Test | @Test | 声明一个测试方法 |
@BeforeClass | @BeforeAll | 在当前类的所有测试方法之前执行。注解在【静态方法】上 |
@AfterClass | @AfterAll | 在当前类中的所有测试方法之后执行。注解在【静态方法】上 |
@Before | @BeforeEach | 在每个测试方法之前执行。注解在【非静态方法】上 |
@After | @AfterEach | 在每个测试方法之后执行。注解在【非静态方法】 |
Junit4的注解列表
Junit5注解列表
@Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试
@ParameterizedTest :表示方法是参数化测试,下方会有详细介绍
@RepeatedTest :表示方法可重复执行,下方会有详细介绍
@DisplayName :为测试类或者测试方法设置展示名称
@BeforeEach :表示在每个单元测试之前执行
@AfterEach :表示在每个单元测试之后执行
@BeforeAll :表示在所有单元测试之前执行
@AfterAll :表示在所有单元测试之后执行
@Tag :表示单元测试类别,类似于JUnit4中的@Categories
@Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
@Timeout :表示测试方法运行如果超过了指定时间将会返回错误
@ExtendWith :为测试类或测试方法提供扩展类引用
2、导入包区别
junit5
import org.junit.jupiter.api.Test;
junit4
import org.junit.Test;
3、常用断言
断言测试也就是期望值测试,是单元测试的核心也就是决定测试结果的表达式,Assert对象中的断言方法:
4、SpringBoot使用基本的Junit单元测试
使用Junit4的一个样例
package com.boot.skywalk;
import lombok.extern.slf4j.Slf4j;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class CommonUnitJunit4Test {
@BeforeClass
public static void beforeClass(){
log.info("start execute unit testing");
}
@AfterClass
public static void afterClass(){
log.info("end execute unit testing");
}
@Test
public void doAssertEqualsTest() {
int num = new Integer(1);
Assert.assertEquals(num, 1);
}
@Test
public void doAssertNotEqualsTest(){
int num = new Integer(1);
Assert.assertEquals(num, 2);
}
@Test
public void doTest() {
String[] string1 = {"1", "2"};
String[] string2 = string1;
String[] string3 = {"1", "2"};
Assert.assertArrayEquals(string1, string2);
Assert.assertArrayEquals(string2, string3);
Assert.assertSame(string1, string2);
Assert.assertSame(string2, string3);
}
}
使用Junit5的样例
package com.boot.skywalk;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@Slf4j
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class CommonUnitJunit5Test {
@BeforeEach
public static void beforeClass(){
log.info("start execute unit testing");
}
@AfterEach
public static void afterClass(){
log.info("end execute unit testing");
}
@Test
public void doAssertEqualsTest() {
int num = new Integer(1);
Assertions.assertEquals(num, 1);
}
@Test
public void doAssertNotEqualsTest(){
int num = new Integer(1);
Assertions.assertEquals(num, 2);
}
@Test
public void doTest() {
String[] string1 = {"1", "2"};
String[] string2 = string1;
String[] string3 = {"1", "2"};
Assertions.assertArrayEquals(string1, string2);
Assertions.assertArrayEquals(string2, string3);
Assertions.assertSame(string1, string2);
Assertions.assertSame(string2, string3);
}
}
在单元测试中,模拟对象可以模拟复杂的、真实的对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。
在下面的情形,可能需要使用模拟对象来代替真实对象:
1、使用依赖
SpringBoot的单元测试组件引入
org.springframework.boot
spring-boot-starter-test
test
包含组件如下:
org.mockito
mockito-core
4.5.1
compile
org.mockito
mockito-junit-jupiter
4.5.1
compile
2、具体使用
Mockito.when( 对象.方法名() ).thenReturn( 自定义结果 )
thenThrow 系列方法
mockito在spring boot中的使用_springboot使用mockito_hymei0的博客-CSDN博客