如何推广手机网站,怎么建一个自己的网站,住建厅官网证件查询,做网站要多少钱新乡SpringBoot基础系列文章
SpringBoot基础(一)#xff1a;快速入门
SpringBoot基础(二)#xff1a;配置文件详解
SpringBoot基础(三)#xff1a;Logback日志
SpringBoot基础(四)#xff1a;bean的多种加载方式
SpringBoot基础(五)#xff1a;集成JUnit5 目录 一、JUnit…SpringBoot基础系列文章
SpringBoot基础(一)快速入门
SpringBoot基础(二)配置文件详解
SpringBoot基础(三)Logback日志
SpringBoot基础(四)bean的多种加载方式
SpringBoot基础(五)集成JUnit5 目录 一、JUnit5介绍1、JUnit5组成结构2、什么是单元测试 二、SpringBoot整合JUnit51、快速入门2、测试类和测试方法不需要声明为public3、SpringBootTest工作原理4、生成单元测试类 三、常用注解1、BeforeAll2、AfterAll3、BeforeEach4、AfterEach5、DisplayName6、Disabled7、RepeatedTest 四、常用断言1、assertEquals(expected, actual)2、assertNotEquals(expected, actual)3、assertTrue(condition)4、assertFalse(condition)5、assertNull(actual)6、assertNotNull(actual)7、assertArrayEquals(expected, actual)8、assertSame(expected, actual)9、assertNotSame(expected, actual)10、fail(message)11、带有消息参数的断言 五、MockBean注入1、MockBean的主要作用2、MockBean的典型用法模拟数据层 一、JUnit5介绍 JUnit5是一个功能强大的单元测试框架是JUnit系列的最新版本它引入了多个改进和新特性旨在为Java应用程序提供灵活且模块化的测试支持。
1、JUnit5组成结构
JUnit Platform这个模块提供了测试的启动API和运行环境是整个JUnit5框架的核心。它支持在不同的环境中运行测试如命令行、IDE或构建工具例如Maven、GradleJUnit Jupiter这个模块包含了JUnit5的新测试编写和扩展模型提供了全新的注解、测试方法和扩展机制JUnit Vintage为了支持旧版本的JUnit测试JUnit3和JUnit4JUnit5提供了Vintage模块。这个模块允许开发者继续运行以前版本的测试同时过渡到JUnit5
2、什么是单元测试
单元测试是指对软件中的最小可测试单元进行检查和验证的过程叫单元测试在SpringBoot中最小可测试单元就是指方法
二、SpringBoot整合JUnit5
1、快速入门
SpringBoot版本从2.2以后默认支持JUnit5
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope
/dependency测试类应放在src/test/java目录下 import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;SpringBootTest
class MySpringBootApplicationTests {Testvoid contextLoads() {// 测试 Spring 应用上下文是否成功加载}
}2、测试类和测试方法不需要声明为public
在JUnit4中测试类和测试方法必须是public的因为JUnit4通过反射机制要求访问公共方法而JUnit5则没有这种要求测试类和方法的可见性设为包级默认足够 JUnit 5 框架执行测试 因为 JUnit 5 本质上是在测试框架内部执行这些测试包级别的可见性允许同一包内的类访问测试类而不需要将其暴露为 public
3、SpringBootTest工作原理 它会启动整个Spring容器加载应用程序的所有Bean并创建一个完整的应用上下文。这是集成测试因为它模拟了应用程序的真实运行环境。 查找主配置类的两种方式 包扫描默认情况下SpringBootTest 会从测试类所在的包开始向上查找同一包或父包中带有 SpringBootApplication或SpringBootConfiguration注解的类作为应用的配置类 显式指定如果 SpringBootTest 无法自动找到 SpringBootApplication 注解的配置类或者你希望手动指定配置类你可以在SpringBootTest 注解中使用classes属性显式指定应用的配置类 4、生成单元测试类
在需要生成单元测试的类中按Alt Ins选择test测试 选择测试方法 生成的测试类放入与本类相同的包结构下 三、常用注解
1、BeforeAll
用于在所有测试方法之前执行的静态初始化代码通常用于在执行所有测试之前进行一次性设置例如建立数据库连接、初始化共享资源等被注解的方法必须是static
BeforeAll
static void setup() {System.out.println(Running setup before all tests...);
}2、AfterAll
用于在所有测试方法执行完成后运行的静态清理代码通常用于释放资源、关闭连接等操作被注解的方法必须是static
AfterAll
static void tearDown() {System.out.println(Running teardown after all tests...);
}3、BeforeEach
用于在每个测试方法之前执行的初始化代码常用于在每个测试方法执行之前准备一些通用的数据或环境
BeforeEach
void init() {System.out.println(Running setup before each test...);
}4、AfterEach
用于在每个测试方法之后执行的清理代码常用于在每个测试方法之后恢复原状或清理一些资源
AfterEach
void cleanup() {System.out.println(Running cleanup after each test...);
}5、DisplayName
用于为测试类或测试方法提供一个更具可读性或说明性的名称便于在测试报告中展示 6、Disabled
当执行所有测试方法时候Disabled注解的方法不会执行 7、RepeatedTest
用于多次重复执行某个测试可以指定重复次数 四、常用断言 断言Assertions在单元测试中用于验证程序行为是否符合预期。JUnit 提供了一组用于编写断言的方法断言的使用可以帮助判断测试是否通过。类名org.junit.jupiter.api.Assertions
1、assertEquals(expected, actual)
验证两个对象是否相等可以用于各种数据类型包括基本类型、对象等
assertEquals(5, 2 3);
assertEquals(Hello, greetingService.getGreeting());2、assertNotEquals(expected, actual)
验证两个对象是否不相等
assertNotEquals(10, 2 3);3、assertTrue(condition)
验证条件为true
assertTrue(5 3);4、assertFalse(condition)
验证条件为false
assertFalse(3 5);5、assertNull(actual)
验证对象是否为null
String str null;
assertNull(str);6、assertNotNull(actual)
验证对象是否不为null
String str Hello;
assertNotNull(str);7、assertArrayEquals(expected, actual)
验证两个数组是否相等数组的长度和元素的顺序都必须相同
int[] expected {1, 2, 3};
int[] actual {1, 2, 3};
assertArrayEquals(expected, actual);8、assertSame(expected, actual)
验证两个对象引用是否指向同一个对象即是同一个对象的引用
Object obj new Object();
assertSame(obj, obj);9、assertNotSame(expected, actual)
验证两个对象引用是否不指向同一个对象
Object obj1 new Object();
Object obj2 new Object();
assertNotSame(obj1, obj2);10、fail(message)
强制使测试失败通常用于标记不应该被执行的代码路径
if (someCondition) {fail(Unexpected condition occurred);
}11、带有消息参数的断言 JUnit的断言方法通常有一个变体可以带有一个额外的字符串参数用于在测试失败时提供错误消息帮助更快找到问题。 五、MockBean注入
1、MockBean的主要作用
MockBean会将应用上下文中的某个Bean替换为模拟的BeanMock 对象MockBean自动与Spring上下文集成允许模拟的Bean被注入到需要它的其他Bean中
2、MockBean的典型用法模拟数据层 假设我们有一个UserService依赖于UserRepository而我们在测试中不想使用真实的UserRepository而是使用模拟对象。
Service
public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository userRepository;}public User getUserById(Long id) {return userRepository.findById(id);}
}
使用MockBean来模拟UserRepositorygiven方法模拟了userRepository.findById(1L) 方法的调用并定义了当该方法被调用时willReturn表示返回一个mockUser对象
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.BDDMockito.given;SpringBootTest
public class UserServiceTest {Autowiredprivate UserService userService;// 模拟 UserRepository替换掉应用上下文中的实际 BeanMockBeanprivate UserRepository userRepository;Testvoid testGetUserById() {// 创建模拟数据User mockUser new User(1L, John Doe);// 使用 Mockito 的 BDD 风格方法设置模拟行为given(userRepository.findById(1L)).willReturn(mockUser);// 调用服务层方法验证返回值是否符合预期User result userService.getUserById(1L);assertEquals(John Doe, result.getName());}
}