验证行为
@Test
public void verify_behaviour(){
List mock = mock(List.class);
mock.add(1);
mock.clear();
verify(mock).add(1);
verify(mock).clear();
}
模拟期望值
@Test
public void when_thenReturn(){
//mock一个Iterator类
Iterator iterator = mock(Iterator.class);
//预设当iterator调用next()时第一次返回hello,第n次都返回world
when(iterator.next()).thenReturn("hello").thenReturn("world");
//使用mock的对象
String result = iterator.next() + " " + iterator.next() + " " + iterator.next();
//验证结果
assertEquals("hello world world",result);
}
模拟异常
@Test(expected = IOException.class)
public void when_thenThrow() throws IOException {
OutputStream outputStream = mock(OutputStream.class);
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
doThrow(new IOException()).when(outputStream).close();
outputStream.close();
}
参数匹配
@Test
public void with_arguments(){
Comparable comparable = mock(Comparable.class)
//预设根据不同的参数返回不同的结果
when(comparable.compareTo("Test")).thenReturn(1)
when(comparable.compareTo("Omg")).thenReturn(2)
assertEquals(1, comparable.compareTo("Test"))
assertEquals(2, comparable.compareTo("Omg"))
//对于没有预设的情况会返回默认值
assertEquals(0, comparable.compareTo("Not stub"))
}
匹配任意参数
@Test
public void with_unspecified_arguments(){
List list = mock(List.class);
when(list.get(anyInt())).thenReturn(1);
when(list.contains(argThat(new IsValid()))).thenReturn(true);
assertEquals(1, list.get(1));
assertEquals(1, list.get(999));
assertTrue(list.contains(1));
assertTrue(!list.contains(3));
}
private class IsValid extends ArgumentMatcher<List>{
@Override
public boolean matches(Object o) {
return o == 1 || o == 2;
}
}
验证调用次数
@Test
public void verifying_number_of_invocations(){
List list = mock(List.class);
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(3);
list.add(3);
verify(list).add(1);
verify(list,times(1)).add(1);
verify(list,times(2)).add(2);
verify(list,times(3)).add(3);
verify(list,never()).add(4);
verify(list,atLeastOnce()).add(1);
verify(list,atLeast(2)).add(2);
verify(list,atMost(3)).add(3);
}
验证执行顺序
@Test
public void verification_in_order(){
List list = mock(List.class)
List list2 = mock(List.class)
list.add(1)
list2.add("hello")
list.add(2)
list2.add("world")
//将需要排序的mock对象放入InOrder
InOrder inOrder = inOrder(list,list2)
//下面的代码不能颠倒顺序,验证执行顺序
inOrder.verify(list).add(1)
inOrder.verify(list2).add("hello")
inOrder.verify(list).add(2)
inOrder.verify(list2).add("world")
}
验证模拟对象上无互动发生
@Test
public void verify_interaction(){
List list = mock(List.class);
List list2 = mock(List.class);
List list3 = mock(List.class);
list.add(1);
verify(list).add(1);
verify(list,never()).add(2);
verifyZeroInteractions(list2,list3);
}