[系列] Mockito 快速入门

1. 简介

在这篇文章中我们将通过【新增用户】用例,讲解 Mockito 框架的基本使用,以及与 Junit5 测试框架的集成。

2. Maven 依赖

2.1. 关键依赖

  • junit-jupiter-engine:5.6.2
  • mockito-core:3.9.0

    <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.6.2</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.9.0</version>
    <scope>test</scope>
    </dependency>

    2.2 Mockito Extension

    JUnit5 中需要添加 mockito-junit-jupiter:3.6.28 依赖,用于支持 MockitoExtension

    <dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>3.6.28</version>
    <scope>test</scope>
    </dependency>

    3. 待测试用例【新增用户】

    业务代码

    UserServiceImpl 类负责具体的业务逻辑实现,其通过调用 UserDao 的 insert 方法,将用户信息持久化到 DB。
public interface UserService {
    boolean save();
}

public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;
    @Override
    public boolean save() {
        boolean result = userDao.insert();
        return result;
    }
}

public class UserDao {
    public boolean insert() {
        System.out.println("user insert success");
        return true;
    }
}

4. 创建测试代码

4.1. 测试思路

TODO...

4.2. 关键步骤:

  1. 新增测试类 UserServiceTest
  2. 新增测试方法 testSaveUser_Default_Success
  3. UserServiceTest 类添加 @ExtendWith(MockitoExtension.class) ,因为在 Junit5 中需要通过该方式来让 @Mock@InjectMocks 生效。
  4. 通过 @Mock 创建一个 UserDao 模拟实现类
  5. 通过 @InjectMocks 创建一个 UserService 模拟实现类,并将 @Mock 标记的 UserDao 依赖注入其内部。
  6. 遵循 Given-When-Then 的结构方式编写测试方法。

    1. Given 给出上下文(准备数据)
    2. When 执行测试代码
    3. Then 断言测试结果
  7. 定制 Mock 对象(UserDao 对象)insert 方法的返回值,使其返回 true

    1. when(dao.insert()).thenReturn(false);
  8. 断言测试结果

    1. assertTrue(result);

完整示例代码:

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
    // @Mock 为 UserDao 模拟一个实现。
    @Mock
    UserDao dao;
    // @InjectMocks 为 UserServiceImpl 类模拟一个实现,另外还将 @Mock 标记的依赖模拟注入到其中。
    @InjectMocks
    UserServiceImpl service;
    @Test
    @DisplayName("测试新增用户用例")
    void testSaveUser_Guide() {
        // Given
        when(dao.insert()).thenReturn(true);
        // When
        boolean result = service.save();
        // Then
        assertTrue(result);
    }
}

5. 信息参考

兴趣是学习的动力之一。

264 声望
5 粉丝
0 条评论

兴趣是学习的动力之一。

264 声望
5 粉丝
宣传栏