
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());
}
}