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

相关推荐
布朗克1686 分钟前
38 Spring Boot入门——自动配置、核心注解与Starter机制
java·spring boot·后端
半夜燃烧的香烟18 分钟前
springboot3.0 集成minio上传文件,支持多个桶名
java·开发语言·spring boot
m0_5477229228 分钟前
从零搭建乒乓球比赛管理系统——Spring Boot + 原生 HTML 实战
spring boot·后端·html
小马爱打代码1 小时前
Spring Boot 自动装配流程
java·spring boot·后端
我登哥MVP1 小时前
SpringCloud 核心组件解析:分布式配置管理
java·spring boot·分布式·spring·spring cloud·java-ee·maven
Flittly1 小时前
【AgentScope Java新手村系列】(6)Hook与Middleware
java·spring boot·笔记·spring·ai
i220818 Faiz Ul1 小时前
药店管理|基于springboot + vue药店管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·美食分享系统
都说名字长不会被发现2 小时前
Spring Boot Starter 中间件账号密码加密方案设计与实现
java·spring boot·后端·中间件
终将老去的穷苦程序员18 小时前
基于SpringBoot的餐饮管理系统
java·spring boot·后端