参考:Mockito Series | Baeldung
Mockito Tutorial
TL;DR
Mockito 让我们可以方便的创建任何类的代理实例,并方便地控制这个实例的行为
应用:当你想测试函数A,但函数A运行必须的函数B还没有写好,那么此时可以mock函数B,让函数A正常运行下去
Cheatsheet
使用方法
mock(): 创造一个替身when(...).thenReturn(...): 给替身写剧本(打桩 Stubbing)verify(...): 检查替身是否真的按剧本演了(验证 Verification)
// 1. 选角
List<String> mockedList = mock(List.class);
// 2. 写剧本:当调用 get(0) 时,返回 "first"
when(mockedList.get(0)).thenReturn("first");
// 3. 演员上场(在你的业务逻辑里被调用)
System.out.println(mockedList.get(0)); // 输出 "first"
// 4. 检查:确保 get(0) 真的被调用过 1 次
verify(mockedList).get(0);
mock()
当没有使用when 指定行为时,代理实例会返回默认值;Integer 返回0 Object返回null之类
@MockBean
在spring环境下
如果想要代理类能在其他地方被使用,那么就要进行依赖注入
spy()
与mock()几乎一样,唯一不同的是,当没有指定行为时,代理实例执行原类方法,就像一个spy
@ExtendWith(MockitoExtension.class)
@ExtendWith(MockitoExtension.class) // Mockito 开始工作
class UserServiceTest {
@Mock
private UserCenterService userCenterService; // 代理
@InjectMocks
private UserService userService; // 被代理替代的
@Test
void testCreate() {
// ... 写剧本 ...
// ... 执行业务 ...
// ... 验证结果 ...
}
}
@Mock: 相当于 mock(Class)
@InjectMocks
尝试new userService实例(类似Bean), 然后对于userService 的成员变量userCenterService,发现有对应的@Mock,就把userCenterService 注入到userService中