找回密码
 立即注册
查看: 597|回复: 0

[其它] Mockito Mybatis-plus 单元测试

[复制链接]

224

主题

0

回帖

773

积分

高级会员

积分
773
发表于 2024-7-7 18:13:17 | 显示全部楼层 |阅读模式
本帖最后由 御坂主机 于 2024-7-7 19:49 编辑

1. 概述

单元测试是软件开发中的一个重要环节,它可以帮助我们确保代码的正确性和稳定性。Mockito是一个流行的java测试框架,可以用于创建和配置模拟对象,从而方便地进行单元测试。MyBatis-Plus是MyBatis的增强版,它简化了MyBatis的使用。本文将详细介绍如何使用Mockito对MyBatis-Plus进行单元测试。

1.1 Mockito简介

Mockito是一个用于Java的模拟测试框架。它通过模拟对象的行为,使我们能够独立地测试类的各个部分,而不依赖于其依赖项的实际实现。

1.2 MyBatis-Plus简介

MyBatis-Plus是MyBatis的增强版,提供了CRUD操作的简化方法,使开发者能够更快捷地与数据库进行交互。

2. 准备工作

在开始单元测试之前,我们需要确保项目中已经添加了Mockito和MyBatis-Plus的依赖。

2.1 添加依赖

在Maven项目中,添加以下依赖:

  1. <dependency>
  2.     <groupId>org.mockito</groupId>
  3.     <artifactId>mockito-core</artifactId>
  4.     <version>4.0.0</version>
  5.     <scope>test</scope>
  6. </dependency>
  7. <dependency>
  8.     <groupId>com.baomidou</groupId>
  9.     <artifactId>mybatis-plus-boot-starter</artifactId>
  10.     <version>3.4.3.4</version>
  11. </dependency>
复制代码


2.2 配置测试环境

确保你的项目配置了JUnit测试环境,本文以JUnit 5为例。

  1. <dependency>
  2.     <groupId>org.junit.jupiter</groupId>
  3.     <artifactId>junit-jupiter-engine</artifactId>
  4.     <version>5.7.0</version>
  5.     <scope>test</scope>
  6. </dependency>
复制代码


3. 编写单元测试

下面我们以一个简单的用户服务类为例,展示如何使用Mockito对MyBatis-Plus进行单元测试。

3.1 服务类示例

假设我们有一个UserService类,用于处理用户的CRUD操作。

  1. public class UserService {

  2.     @Autowired
  3.     private UserMapper userMapper;

  4.     public User getUserById(Long id) {
  5.         return userMapper.selectById(id);
  6.     }

  7.     public boolean createUser(User user) {
  8.         return userMapper.insert(user) > 0;
  9.     }

  10.     public boolean deleteUserById(Long id) {
  11.         return userMapper.deleteById(id) > 0;
  12.     }
  13. }
复制代码

3.2 测试类示例

我们将使用Mockito来模拟UserMapper对象,并对UserService类进行单元测试。

  1. import static org.mockito.Mockito.*;
  2. import static org.junit.jupiter.api.Assertions.*;
  3. import org.junit.jupiter.api.BeforeEach;
  4. import org.junit.jupiter.api.Test;
  5. import org.mockito.InjectMocks;
  6. import org.mockito.Mock;
  7. import org.mockito.MockitoAnnotations;

  8. public class UserServiceTest {

  9.     @Mock
  10.     private UserMapper userMapper;

  11.     @InjectMocks
  12.     private UserService userService;

  13.     @BeforeEach
  14.     public void setUp() {
  15.         MockitoAnnotations.openMocks(this);
  16.     }

  17.     @Test
  18.     public void testGetUserById() {
  19.         User user = new User();
  20.         user.setId(1L);
  21.         when(userMapper.selectById(1L)).thenReturn(user);

  22.         User result = userService.getUserById(1L);
  23.         assertNotNull(result);
  24.         assertEquals(1L, result.getId());
  25.     }

  26.     @Test
  27.     public void testCreateUser() {
  28.         User user = new User();
  29.         when(userMapper.insert(user)).thenReturn(1);

  30.         boolean result = userService.createUser(user);
  31.         assertTrue(result);
  32.     }

  33.     @Test
  34.     public void testDeleteUserById() {
  35.         when(userMapper.deleteById(1L)).thenReturn(1);

  36.         boolean result = userService.deleteUserById(1L);
  37.         assertTrue(result);
  38.     }
  39. }
复制代码


3.3 解释代码

(1) @Mock注解用于创建UserMapper的模拟对象。
(2) @InjectMocks注解用于将模拟对象注入到UserService中。
(3) MockitoAnnotations.openMocks(this)用于初始化Mockito注解。
(4) 使用when-thenReturn语句来定义模拟对象的行为。
(5) 使用JUnit的断言方法来验证测试结果。

4. 常见问题及解决方法

在使用Mockito和MyBatis-Plus进行单元测试时,可能会遇到一些常见问题。下面列出了一些可能的问题及其解决方法。

4.1 Mock对象未正确注入

确保在测试类中正确使用@Mock和@InjectMocks注解,并在setUp方法中调用MockitoAnnotations.openMocks(this)。

4.2 依赖注入失败

在Spring环境中测试时,可能需要使用@ExtendWith(MockitoExtension.class)注解,以确保Mockito注解能够正确处理。

5. 总结

本文详细介绍了如何使用Mockito对MyBatis-Plus进行单元测试。通过使用Mockito模拟MyBatis-Plus的Mapper对象,可以有效地进行服务层的单元测试,从而提高代码的稳定性和可靠性。希望本文的内容能帮助读者在实际项目中更好地使用Mockito进行单元测试。





------------------------------------------------------------------------------------------------------------------------------------------

========  御 坂 主 机  ========

>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<

>> 推广/合作/找我玩  TG号 : @Misaka_Offical <<

-------------------------------------------------------------------------------------------------------------------------------------------

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:51 , Processed in 0.061577 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表