[系列] 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. 关键步骤:
- 新增测试类
UserServiceTest
- 新增测试方法
testSaveUser_Default_Success
- 为
UserServiceTest
类添加@ExtendWith(MockitoExtension.class)
,因为在Junit5
中需要通过该方式来让@Mock
、@InjectMocks
生效。 - 通过
@Mock
创建一个 UserDao 模拟实现类 - 通过
@InjectMocks
创建一个 UserService 模拟实现类,并将@Mock
标记的 UserDao 依赖注入其内部。 遵循 Given-When-Then 的结构方式编写测试方法。
- Given 给出上下文(准备数据)
- When 执行测试代码
- Then 断言测试结果
定制 Mock 对象(UserDao 对象)
insert
方法的返回值,使其返回true
。when(dao.insert()).thenReturn(false);
断言测试结果
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. 信息参考
推荐阅读
单元测试-PowerMock
PowerMock是一个单元测试框架,可以模拟静态方法,私有方法和final方法等来简化单元测试的编写。本篇文章将结合简单例子对PowerMock的常用方法进行说明。
半夏之沫赞 3阅读 5.4k
一文教会你mock(Mockito和PowerMock双剑合璧)
Mock有模仿、伪造的含义。Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。mock工具使用范畴:
京东云开发者赞 2阅读 405评论 1
JUnit 5 单元测试教程
在软件开发过程中,我们通常都需要测试自己的代码运行是否正常,可能对一个函数进行简单测试,也可能是多个功能的组合测试。不管使用哪种方式,都是为了更好的测试我们的代码是否存在逻辑缺陷。测试对于软件开发...
程序猿阿朗阅读 502
《底层到底做了什么》--- junit5的@ExtendWith
结合github/junit5-samples-extensions简单说明@ExtendWith的底层执行流程。代码 {代码...} {代码...} 时序图[图]执行流程在intellij里执行test1 如果是maven项目,执行intellij-rj里的一个main方法2 如果是gradl...
一句话阅读 273
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。