SpringBoot基础系列文章
JUnit5是一个功能强大的**单元测试
**框架,是JUnit系列的最新版本,它引入了多个改进和新特性,旨在为Java应用程序提供灵活且模块化的测试支持。
启动API和运行环境
**,是整个JUnit5框架的核心。它支持在不同的环境中运行测试,如命令行、IDE或构建工具(例如Maven、Gradle)新测试编写和扩展模型
**,提供了全新的注解、测试方法和扩展机制最小可测试单元
**进行检查和验证的过程叫**单元测试
**SpringBoot
**中,最小可测试单元就是指**方法
**2.2
**以后,默认支持JUnit5<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
src/test/java
**目录下import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MySpringBootApplicationTests {
@Test
void contextLoads() {
// 测试 Spring 应用上下文是否成功加载
}
}
JUnit4
**中,测试类和测试方法**必须是public
**的,因为JUnit4通过反射机制要求访问公共方法JUnit5
**则没有这种要求,测试类和方法的可见性设为**包级(默认)
**足够 JUnit 5 框架执行测试 它会启动整个**Spring容器
**,加载应用程序的**所有Bean
**,并创建一个**完整的应用上下文
**。这是集成测试,因为它模拟了应用程序的真实运行环境。
查找主配置类的两种方式:
包扫描
**:默认情况下,@SpringBootTest 会从测试类所在的包开始,**向上
**查找**同一包或父包
**中带有** @SpringBootApplication
**或**@SpringBootConfiguration
**注解的类,作为应用的配置类**
显式指定
**:如果 @SpringBootTest 无法自动找到 @SpringBootApplication 注解的配置类,或者你希望手动指定配置类,你可以在**@SpringBootTest
注解中使用**classes
**属性显式指定应用的配置类
Alt +Ins
**,选择test(测试)相同的包结构
**下所有测试方法之前
**执行的**静态
**初始化代码static
**@BeforeAll
static void setup() {
System.out.println("Running setup before all tests...");
}
所有测试方法执行完成后
**运行的**静态
**清理代码static
**@AfterAll
static void tearDown() {
System.out.println("Running teardown after all tests...");
}
每个测试方法之前
**执行的初始化代码@BeforeEach
void init() {
System.out.println("Running setup before each test...");
}
每个测试方法之后
**执行的清理代码@AfterEach
void cleanup() {
System.out.println("Running cleanup after each test...");
}
名称
**,便于在测试报告中展示所有
**测试方法时候,@Disabled注解的方法**不会执行
**重复执行
**某个测试,可以**指定重复次数
** 断言(Assertions)在单元测试中用于**验证程序行为是否符合预期
**。JUnit 提供了一组用于编写断言的方法,断言的使用可以帮助判断测试是否通过。类名**org.junit.jupiter.api.Assertions
**
是否相等
**各种数据类型
**,包括基本类型、对象等assertEquals(5, 2 + 3);
assertEquals("Hello", greetingService.getGreeting());
是否不相等
**assertNotEquals(10, 2 + 3);
true
**assertTrue(5 > 3);
false
**assertFalse(3 > 5);
null
**String str = null;
assertNull(str);
不为null
**String str = "Hello";
assertNotNull(str);
长度
**和元素的**顺序
**都必须相同int[] expected = {1, 2, 3};
int[] actual = {1, 2, 3};
assertArrayEquals(expected, actual);
同一个对象
**(即是同一个对象的引用)Object obj = new Object();
assertSame(obj, obj);
不指向同一个对象
**Object obj1 = new Object();
Object obj2 = new Object();
assertNotSame(obj1, obj2);
if (someCondition) {
fail("Unexpected condition occurred");
}
JUnit的断言方法通常有一个变体,可以带有一个额外的**字符串参数
**,用于在**测试失败时提供错误消息
**,帮助更快找到问题。
替换为模拟的Bean(Mock 对象)
** 假设我们有一个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 {
@Autowired
private UserService userService;
// 模拟 UserRepository,替换掉应用上下文中的实际 Bean
@MockBean
private UserRepository userRepository;
@Test
void 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());
}
}