通过前一章 《 Mockito初探(一)—— 初识 》 的学习,我们对 Mockito 的一些基本知识有了初步了解,这章我们继续对 Mockito 的一些基本使用进行讲解。
@Mock 注解的使用
我们可以使用 @Mock 注解 mock 指定的对象,但需要注意的是在测试类中的 before 方法中加上 MockitoAnnotations.initMocks(testClass);
。
@Mock
private List mockedList;
@Before
public void before() {
MockitoAnnotations.initMocks(this);
}
参数匹配
对被 mock 的对象的某个方法进行 stub 时可以对方法的参数进行匹配,以返回期望的结果。
@Test
public void stubWithArgMatcher() {
ArrayList mock = mock(ArrayList.class);
when(mock.get(anyInt())).thenReturn("mock get method");
System.out.println(mock.get((int)(Math.random() * 10)));
}
Mockito 的参数匹配默认是调用对象的 equals()
方法,不过 Mockito 也提供以 any 开头的方法进行参数匹配,这种匹配方式更加灵活,可读性也更好。
Stub 无返回值方法
对于无返回值的方法该如何 stub?
@Test
public void stubVoidMethod() {
doNothing().when(mockedList).add(anyInt(), any());
doThrow(new RuntimeException("throw runtime exception")).when(mockedList).clear();
mockedList.add(0, "123");
mockedList.clear();
}
doNothing()
方法可以 stub 无返回值的方法,Mockito 还提供了一系列的 do 开头的方法,都是类似使用,不过被 stub 的方法不再是写在 when 中,而是写在 when 外部。
verify 额外次数
verify 方法默认是验证相应方法被调用一次,不过 verify 方法也提供了验证多次或额外次数的方法。
@Test
public void verifyExtraNum() {
mockedList.add("once");
mockedList.add("twice");
mockedList.add("twice");
mockedList.add("three times");
mockedList.add("three times");
mockedList.add("three times");
verify(mockedList).add("once");
verify(mockedList, times(1)).add("once");
verify(mockedList, times(2)).add("twice");
verify(mockedList, times(3)).add("three times");
verify(mockedList, never()).add("never happen");
verify(mockedList, atLeastOnce()).add("three times");
verify(mockedList, atLeast(2)).add("three times");
verify(mockedList, atMost(2)).add("twice");
}
verify 方法接受 VerificationMode 参数, 也就是不同的验证方式,times 方法返回验证不同次数的验证方式,例如 times(1)
就是验证相应方法被调用 1 次,以此类推,需要注意的是 verify 验证方法是包括方法调用时的参数都进行匹配的。
never()
方法就是验证方法没有被调用过,atLeast()
就是验证方法至少被调用 2 次,atLeastOnce()
是方法至少被调用 1 次,atMost()
相反是验证方法最多被调用的次数。
这章先介绍到这里,在本章中我们主要了解了使用 @Mock 对对象进行 mock,stub 时对参数的匹配方法和 stub 无返回值方法的方式,以及 verify 额外次数的使用。
本章节示例代码已经上传 GitHub,可点击跳转查看代码详情