springboot 单元测试

Spring Boot 单元测试是确保代码质量的重要部分,它允许我们在不实际启动整个应用的情况下测试我们的代码。在Spring Boot中,我们通常使用Spring Test模块和JUnit测试框架来编写单元测试。以下是一个简单的Spring Boot单元测试的详细代码介绍:

首先,假设我们有一个简单的UserService,它有一个findUserById方法:

java 复制代码
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

接下来,我们将为UserService编写单元测试:

java 复制代码
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Optional;

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

@ExtendWith(MockitoExtension.class)
@SpringBootTest
public class UserServiceTest {

    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    private User user;

    @BeforeEach
    void setUp() {
        user = new User();
        user.setId(1L);
        user.setName("Test User");
    }

    @Test
    void findUserById_UserExists_ReturnsUser() {
        // Arrange
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));

        // Act
        User foundUser = userService.findUserById(1L);

        // Assert
        assertNotNull(foundUser);
        assertEquals(user.getId(), foundUser.getId());
        assertEquals(user.getName(), foundUser.getName());
        verify(userRepository).findById(1L);
    }

    @Test
    void findUserById_UserDoesNotExist_ReturnsNull() {
        // Arrange
        when(userRepository.findById(2L)).thenReturn(Optional.empty());

        // Act
        User foundUser = userService.findUserById(2L);

        // Assert
        assertNull(foundUser);
        verify(userRepository).findById(2L);
    }
}

在上面的代码中,我们使用了Mockito库来模拟UserRepository的行为。@Mock注解用于创建UserRepository的模拟对象,而@InjectMocks注解则用于创建UserService的实例,并将模拟的UserRepository注入到其中。

在setUp方法中,我们创建了一个User对象,用于后续的测试。

我们编写了两个测试用例:findUserById_UserExists_ReturnsUser和findUserById_UserDoesNotExist_ReturnsNull。在每个测试用例中,我们首先使用when方法来定义模拟的UserRepository的行为。然后,我们调用userService.findUserById方法来执行实际的测试。最后,我们使用断言来验证测试的结果是否符合预期。

注意,我们使用verify方法来验证UserRepository的findById方法是否被调用。这是一个好的实践,因为它可以确保我们的代码确实与模拟的对象进行了交互。

总的来说,Spring Boot的单元测试可以帮助我们确保代码的正确性,并在代码更改时提供及时的反馈。通过编写详细的测试用例,我们可以确保应用的各个部分都能正常工作,从而提高应用的质量和可靠性。

相关推荐
code_slave(码畜)5 小时前
微服务架构落地:公共中间件层总览——不承载业务,只承载稳定性
spring boot·spring cloud·微服务·中间件·架构
谢亮_vipxieliang6 小时前
Spring Boot 自动配置原理:从 @SpringBootApplication 到自定义 Starter
java·spring boot·后端
paopaokaka_luck9 小时前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
EatFan11 小时前
Spring Boot 4 迁移避坑清单:Jackson 3、starter 拆分与最低 JDK 口径核对(含若依/芋道/CRMEB 升级对照)
java·数据库·spring boot·spring boot 4·java 21·jakarta ee 11·jackson 3
ly768912 小时前
Spring Boot 集成 Redis 企业级实践:连接池、序列化与缓存穿透雪崩的工程化防御
spring boot·redis·缓存·缓存穿透·布隆过滤器·lettuce 连接池
Wx-bishekaifayuan12 小时前
springboot陨石鉴收系统96265-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
code_slave(码畜)13 小时前
微服务架构落地:基础服务 —— 报表服务(上篇:定位、边界与整体架构)
java·spring boot·spring cloud·微服务·架构
FYKJ_201013 小时前
springboot家政服务平台66766-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·spark·课程设计
x-Achan13 小时前
Redis实现方案:更新策略、穿透、雪崩、击穿、工具封装
java·spring boot·redis·spring·bootstrap·mybatis
新思维软件17 小时前
非机动车管理系统设计 | STM32+RFID+MQTT | X504291项目编号 X504291
spring boot·stm32·单片机·嵌入式硬件