Spring Boot使用JUnit和Mockito进行Service层单元测试


前言

  在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保证这些方法产生的结果是我们想要的呢?那么在SpringBoot项目中我们是如何对Service层的方法进行测试的呢?


一、单元测试是什么

  单元测试是一种软件测试方法,用于测试代码的最小可测试单元。在Java开发中,编写单元测试可以帮助开发人员更好地理解代码的功能和实现,同时也可以提高代码的质量和可维护性。


二、为什么要写单元测试

  • 提高代码质量:编写单元测试可以帮助开发人员更好地理解代码的功能和实现,从而更容易发现代码中的问题和潜在的错误。

  • 提高代码可维护性:单元测试可以帮助开发人员更好地理解代码的实现,从而更容易进行维护和修改。

  • 提高开发效率:单元测试可以帮助开发人员更快地发现代码中的问题和潜在的错误,从而减少调试和修复问题的时间。

  • 保证代码的正确性:单元测试可以帮助开发人员验证代码的正确性,从而确保代码的功能符合预期。

  • 支持持续集成和持续交付:单元测试可以作为持续集成和持续交付流程的一部分,确保代码的质量和稳定性。


三、简单示例

假设我们有一个简单的UserService类,其中包含了一些用户相关的逻辑:

@Service
public class UserService {
   
    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
   
        this.userRepository = userRepository;
    }

    public User createUser(User user) {
   
        // 一些创建用户的逻辑
        return userRepository.save(user);
    }

    public User getUserById(Long id) {
   
        // 一些获取用户的逻辑
        return userRepository.findById(id).orElse(null);
    }
}

我们的目标是编写UserService的单元测试。

首先,我们需要引入JUnit和Mockito的依赖。在Maven项目中,可以在pom.xml文件中添加以下依赖:

<dependencies>
    <!-- 其他依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

接下来,我们可以编写UserService的单元测试:

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
   
    @Mock
    private UserRepository userRepository;

    @InjectMocks
    private UserService userService;

    @Test
    public void testCreateUser() {
   
        User user = new User();
        user.setId(1L);
        user.setUsername("John");
        user.setEmail("john@example.com");

        Mockito.when(userRepository.save(Mockito.any(User.class))).thenReturn(user);

        User createdUser = userService.createUser(user);

        assertNotNull(createdUser);
        assertEquals(1L, createdUser.getId().longValue());
        assertEquals("John", createdUser.getUsername());
        assertEquals("john@example.com", createdUser.getEmail());

        Mockito.verify(userRepository, Mockito.times(1)).save(Mockito.any(User.class));
    }

    @Test
    public void testGetUserById() {
   
        User user = new User();
        user.setId(1L);
        user.setUsername("John");
        user.setEmail("john@example.com");

        Mockito.when(userRepository.findById(1L)).thenReturn(Optional.of(user));

        User retrievedUser = userService.getUserById(1L);

        assertNotNull(retrievedUser);
        assertEquals(1L, retrievedUser.getId().longValue());
        assertEquals("John", retrievedUser.getUsername());
        assertEquals("john@example.com", retrievedUser.getEmail());

        Mockito.verify(userRepository, Mockito.times(1)).findById(1L);
    }
}

解析:

  • 在上述示例中,我们使用了Mockito的注解@Mock@InjectMocks来创建UserService的Mock对象并注入到被测试的userService对象中。
  • 在testCreateUser()方法中,我们使用Mockito的when()方法模拟了 userRepository的save()方法的行为,并返回预设的User对象。然后,我们调用userService的createUser()方法,并对返回的User对象进行断言验证。
  • 在testGetUserById()方法中,我们使用Mockito的when()方法模拟了userRepository的findById()方法的行为,并返回预设的User对象。然后,我们调用userService的getUserById()方法,并对返回的User对象进行断言验证。
  • 最后,我们使用Mockito的verify()方法来验证userRepository的方法是否被调用了指定的次数。

这是一个简单的Spring Boot Service层单元测试的示例。通过使用Mockito,我们可以模拟依赖对象的行为,使得单元测试更加可控和可靠。


总结

  • 本文简单讲述了单元测试是什么、为什么要写单元测试和在SpringBoot项目中我们是如何编写Service层单元测试的以及做了一个简单示例
  • 欢迎大家提出建议以及批评,有任何问题可以私信。

相关推荐

  1. Spring Boot使用JUnitMockito进行Service单元测试

    2023-12-12 06:50:02       39 阅读
  2. JUnit 5Mockito单元测试

    2023-12-12 06:50:02       39 阅读
  3. JUNIT5+Mockito单元测试

    2023-12-12 06:50:02       21 阅读
  4. junit mockito Dao

    2023-12-12 06:50:02       9 阅读
  5. 浅谈单元测试JUnit4使用

    2023-12-12 06:50:02       21 阅读
  6. 单元测试单元测试Mockito使用

    2023-12-12 06:50:02       20 阅读
  7. Springboot单元测试Junit5应用

    2023-12-12 06:50:02       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-12 06:50:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-12 06:50:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-12 06:50:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-12 06:50:02       20 阅读

热门阅读

  1. sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块

    2023-12-12 06:50:02       34 阅读
  2. 【Kotlin】静态方法

    2023-12-12 06:50:02       36 阅读
  3. Kotlin之for循环的具体使用说明

    2023-12-12 06:50:02       38 阅读
  4. axios的使用

    2023-12-12 06:50:02       37 阅读
  5. PHP和go搭建分布式

    2023-12-12 06:50:02       36 阅读
  6. 06-微服务架构之微服务设计指导书

    2023-12-12 06:50:02       41 阅读
  7. 考研真题C语言

    2023-12-12 06:50:02       37 阅读
  8. Ansible hanlder是啥?Ansible Block是啥?

    2023-12-12 06:50:02       34 阅读