//create an inOrder verifier for a single mock
InOrder inOrder =inOrder(list);
inOrder.verify(list).add("was added first");
inOrder.verify(list).add("was added second");
InOrder inOrder =inOrder(firstMock, secondMock);//两个 mock 实例之间的方法的调用顺序
inOrder.verify(firstMock).add("was called first");
inOrder.verify(secondMock).add("was called second");
//mocking lists for the sake of the example (if you mock List in real you will burn in hell)
List mock1 =mock(List.class), mock2 =mock(List.class);//stubbing mocks:when(mock1.get(0)).thenReturn(10);when(mock2.get(0)).thenReturn(20);//using mocks by calling stubbed get(0) methods:
System.out.println(mock1.get(0));//prints 10
System.out.println(mock2.get(0));//prints 20//using mocks by calling clear() methods:
mock1.clear();
mock2.clear();//verification:verify(mock1).clear();verify(mock2).clear();//verifyNoMoreInteractions() fails because get() methods were not accounted for.try{verifyNoMoreInteractions(mock1, mock2);}catch(NoInteractionsWanted e);//因为忽略了 mock1 mock2,即使 get 方法没有 verify 也通过verifyNoMoreInteractions(ignoreStubs(mock1, mock2));verifyZeroInteractions() 等效于 verifyNoMoreInteractions
3.5.2 忽略 InOrder
忽略所有
List list =mock(List.class);when(list.get(0)).thenReturn("foo");
list.add(0);
list.clear();
System.out.println(list.get(0));//we don't want to verify this
InOrder inOrder =inOrder(ignoreStubs(list));
inOrder.verify(list).add(0);
inOrder.verify(list).clear();
inOrder.verifyNoMoreInteractions();
3.5.3 Strictness.STRICT_STUBS
通过 when() 打桩的方法,只要调用了就会被自动校验
没有打桩的方法,必须手动校验
打桩方法,没有被调用,相当于没有校验
@Rulepublic MockitoRule mockito = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
List list =mock(List.class);when(list.get(0)).thenReturn("foo");
list.size();verify(list).size();
list.get(0);// Automatically verified by STRICT_STUBSverifyNoMoreInteractions(list);// No need of ignoreStubs()
//stubbing using built-in anyInt() argument matcherwhen(mockedList.get(anyInt())).thenReturn("element");//stubbing using custom matcher (let's say isValid() returns your own matcher implementation)://isValid 效果同下面的 lambda 表达式when(mockedList.contains(argThat(isValid()))).thenReturn(true);//following prints "element"
System.out.println(mockedList.get(999));//you can also verify using an argument matcherverify(mockedList).get(anyInt());//argument matchers can also be written as Java 8 Lambdasverify(mockedList).add(argThat(someString -> someString.length()>5));//以下是正确的verify(mock).someMethod(anyInt(),anyString(),eq("third argument"));//以下是错误的verify(mock).someMethod(anyInt(),anyString(),"third argument");
4.1 自定义 matcher
classListOfTwoElementsimplementsArgumentMatcher<List>{publicbooleanmatches(List list){return list.size()==2;}public String toString(){//printed in verification errorsreturn"[list of 2 elements]";}}
List mock =mock(List.class);when(mock.addAll(argThat(newListOfTwoElements))).thenReturn(true);//Arrays.asList("one","two") 满足 matches 所以能被使用
mock.addAll(Arrays.asList("one","two"));verify(mock).addAll(argThat(newListOfTwoElements()));//简写verify(mock).addAll(argThat(newListOfTwoElements()));//becomes,将 argThat(new ListOfTwoElements()) 抽成方法verify(mock).addAll(listOfTwoElements());//lambdaverify(mock).addAll(argThat(list -> list.size()==2));
List list =mock(ArrayList.class,newArrayListAnswer());assert"[1, 2]".equals(list.get(1).toString());verify(list).get(anyInt());//lambda 形式
List list1 =mock(ArrayList.class, invocation -> Arrays.asList(1,3));assert"[1,3]".equals(list1.get(1).toString());verify(list).get(anyInt());classArrayListAnswerimplementsAnswer<List>{@Overridepublic List answer(InvocationOnMock invocation)throws Throwable {return Arrays.asList(1,2);}}
6.2 doAnswer
List list =mock(ArrayList.class);doAnswer(invocation ->11).when(list).get(1);assert11==(int)list.get(1);assert list.get(2)== null;
7 MockingDetails 获取对象信息
//To identify whether a particular object is a mock or a spy:
Mockito.mockingDetails(someObject).isMock();
Mockito.mockingDetails(someObject).isSpy();//Getting details like type to mock or default answer:
MockingDetails details =mockingDetails(mock);
details.getMockCreationSettings().getTypeToMock();
details.getMockCreationSettings().getDefaultAnswer();//Getting invocations and stubbings of the mock:
MockingDetails details =mockingDetails(mock);
details.getInvocations();
details.getStubbings();//Printing all interactions (including stubbing, unused stubs)
System.out.println(mockingDetails(mock).printInvocations());
8 代理难以 mock 的对象
Final classes but with an interface
Already custom proxied object
Special objects with a finalize method, i.e. to avoid executing it 2 times