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_ReturnsUserfindUserById_UserDoesNotExist_ReturnsNull。在每个测试用例中,我们首先使用when方法来定义模拟的UserRepository的行为。然后,我们调用userService.findUserById方法来执行实际的测试。最后,我们使用断言来验证测试的结果是否符合预期。

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

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

相关推荐
Lucky GGBond2 小时前
Vue + Spring Boot 实现 Excel 导出实例
vue.js·spring boot·excel
seven97_top2 小时前
Springboot 常见面试题汇总
java·spring boot·后端
瑶山5 小时前
社区版Idea怎么创建Spring Boot项目?Selected Java version 17 is not supported. 问题解决
java·spring boot·intellij-idea·创建项目
陈小桔6 小时前
SpringBoot之配置文件
spring boot
智能化咨询6 小时前
基于Spring Boot + Vue 3的乡村振兴综合服务平台性能优化与扩展实践
vue.js·spring boot·性能优化
Hoking7 小时前
LangChain4j集成SpringBoot接入百炼大模型(Qwen)
java·人工智能·spring boot·llm
编啊编程啊程9 小时前
【004】生菜阅读平台
java·spring boot·spring cloud·dubbo·nio
椎49510 小时前
web后端开发——原理
spring boot·spring·mybatis
岁岁岁平安10 小时前
Java+SpringBoot+Dubbo+Nacos快速入门
java·spring boot·nacos·rpc·dubbo
小咕聊编程12 小时前
【含文档+PPT+源码】基于springboot的旅游路线推荐系统的设计与实现
spring boot·后端·旅游