when(datas.get(anyInt())).thenAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { Integer index = invocation.getArgument(0); return "YOUR INDEX IS : NO." + index; } }); //获取方法的参数并返回参数组成的字符串
when(datas.get(255)) .thenReturn("FIRST INVOKE GET(255)") .thenReturn("SECOND INVOKE GET(255)") .thenThrow(new RuntimeException("CAN'T GET MORE THAN THREE TIMES")); //第一次返回第一句thenReturn,第二次第二句,第三次抛异常
@Test
public void testCaptor(){
datas.add("ADD ONE STRING");
datas.add("ADD TWO STRING");
//验证时对方法的参数进行捕获
verify(datas,times(2)).add(stringCaptor.capture());
System.out.println(stringCaptor.getAllValues());
// output : [ADD ONE STRING, ADD TWO STRING]
}
1 2
#### 验证顺序
@Test
public void testOrder(){
datas.add("A");
datas.clear();
datas.add("B");
InOrder order = inOrder(datas);
//顺序以及参数要完全匹配
order.verify(datas).add("A");
order.verify(datas).clear();
order.verify(datas).add("B");
}
@Test
public void verifyZero(){
List a = mock(List.class);
List b = mock(List.class);
List c = mock(List.class);
a.add(1);
//验证对象都没有互动产生
verifyZeroInteractions(a,b,c);
//上述代码异常,因为list a 进行了操作,
}
1 2
#### 清除mock
@Test
public void reset_mock(){
List list = mock(List.class);
when(list.size()).thenReturn(10);
list.add(1);
assertEquals(10,list.size());
//重置mock,清除所有的互动和预设
reset(list);
assertEquals(0,list.size());
}
Spy
1 2
#### 监控真实对象Spy
@Test
public void spyTest() {
List<String> list = new ArrayList<>();
List spy = spy(list);
//spy会调用真实对象的方法
doReturn("HELLO SPYER").when(spy).get(100);
//do...when 会避免调用真实对象的方法
when(spy.get(50)).thenReturn("OUT OF BOUNDS");
//when...then 会调用真实对象方法, 因为此时length为0 调用get(50)会异常
assertEquals(spy.get(100),"HELLO SPYER");
assertEquals(spy.get(50),"OUT OF BOUNDS");
}