Mockito简单教程官网:文档:项目源码:引入首先添加maven依赖dependencygroupIdorg.mockito/groupIdartifactIdmockito-all/artifactIdversion1.9.5/versionscopetest/scope/dependency当然mockito需要junit配合使用dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope/dependency然后为了使代码更简洁,最好在测试类中导入静态资源importstaticorg.mockito.Mockito.*;importstaticorg.junit.Assert.*;下面我们开始使用mockito来做测试。1、验证行为@Testpublicvoidverify_behaviour(){//模拟创建一个List对象Listmock=mock(List.class);//使用mock的对象mock.add(1);mock.clear();//验证add(1)和clear()行为是否发生verify(mock).add(1);verify(mock).clear();}2、模拟我们所期望的结果@Testpublicvoidwhen_thenReturn(){//mock一个Iterator类Iteratoriterator=mock(Iterator.class);//预设当iterator调用next()时第一次返回hello,第n次都返回worldwhen(iterator.next()).thenReturn(hello).thenReturn(world);//使用mock的对象Stringresult=iterator.next()++iterator.next()++iterator.next();//验证结果assertEquals(helloworldworld,result);}@Test(expected=IOException.class)publicvoidwhen_thenThrow()throwsIOException{OutputStreamoutputStream=mock(OutputStream.class);OutputStreamWriterwriter=newOutputStreamWriter(outputStream);//预设当流关闭时抛出异常doThrow(newIOException()).when(outputStream).close();outputStream.close();}3、参数匹配@Testpublicvoidwith_arguments(){Comparablecomparable=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(Notstub));}除了匹配制定参数外,还可以匹配自己想要的任意参数@Testpublicvoidwith_unspecified_arguments(){Listlist=mock(List.class);//匹配任意参数when(list.get(anyInt())).thenReturn(1);when(list.contains(argThat(newIsValid()))).thenReturn(true);assertEquals(1,list.get(1));assertEquals(1,list.get(999));assertTrue(list.contains(1));assertTrue(!list.contains(3));}privateclassIsValidextendsArgumentMatcherList{@Overridepublicbooleanmatches(Objecto){returno==1||o==2;}}需要注意的是如果你使用了参数匹配,那么所有的参数都必须通过matchers来匹配@Testpublicvoidall_arguments_provided_by_matchers(){Comparatorcomparator=mock(Comparator.class);comparator.compare(nihao,hello);//如果你使用了参数匹配,那么所有的参数都必须通过matchers来匹配verify(comparator).compare(anyString(),eq(hello));//下面的为无效的参数匹配使用//verify(comparator).compare(anyString(),hello);}4、验证确切的调用次数@Testpublicvoidverifying_number_of_invocations(){Listlist=mock(List.class);list.add(1);list.add(2);list.add(2);list.add(3);list.add(3);list.add(3);//验证是否被调用一次,等效于下面的times(1)verify(list).add(1);verify(list,times(1)).add(1);//验证是否被调用2次verify(list,times(2)).add(2);//验证是否被调用3次verify(list,times(3)).add(3);//验证是否从未被调用过verify(list,never()).add(4);//验证至少调用一次verify(list,atLeastOnce()).add(1);//验证至少调用2次verify(list,atLeast(2)).add(2);//验证至多调用3次verify(list,atMost(3)).add(3);}5、模拟方法体抛出异常@Test(expected=RuntimeException.class)publicvoiddoThrow_when(){Listlist=mock(List.class);doThrow(newRuntimeException()).when(list).add(1);list.add(1);}6、验证执行顺序@Testpublicvoidverification_in_order(){Listlist=mock(List.class);Listlist2=mock(List.class);list.add(1);list2.add(hello);list.add(2);list2.add(world);//将需要排序的mock对象放入InOrderInOrderinOrder=inOrder(list,list2);//下面的代码不能颠倒顺序,验证执行顺序inOrder.verify(list).add(1);inOrder.verify(list2).add(hello);inOrder.verify(list).add(2);inOrder.verify(list2).add(world);}7、确保模拟对象上无互动发生@Testpublicvoidverify_interaction(){Listlist=mock(List.class);Listlist2=mock(List.class);Listlist3=mock(List.class);list.add(1);verify(list).add(1);verify(list,never()).add(2);//验证零互动行为verifyZeroInteractions(list2,list3);}8、找出冗余的互动(即未被验证到的)@Test(expected=NoInteractionsWanted.class)publicvoidfind_redundant_interaction(){Listlist=mock(List.class);list.add(1);list.add(2);verify(list,times(2)).add(anyInt());//检查是否有未被验证的互动行为,因为add(1)和add(2)都会被上面的anyInt()验证到,所以下面的代码会通过verifyNoMoreInteractions(list);Listlist2=mock(List.class);list2.add(1);list2.add(2);verify(list2).add(1);//检查是否有未被验证的互动行为,因为add(2)没有被验证,所以下面的代码会失败抛出异常verifyNoMoreInteractions(list2);}9、使用注解来快速模拟在上面的测试中我们在每个测试方法里都mock了一个List对象,为了避免重复的mock,是测试类更具有可读性,我们可以使用下面的注解方式来快速模拟对象:@MockprivateListmockList;OK,我们再用注解的mock对象试试@Testpublicvoidshorthand(){mockList.add(1);verify(mockList).add(1);}运行这个测试类你会发现报错了,mock的对象为NULL,为此我们必须在基类中添加初始化mock的代码publicclassMockitoExample2{@MockprivateListmockList;publicMockitoExample2(){MockitoAnnotations.initMocks(this);}@Testpublicvoidshorthand(){mockList.add(1);verify(mockList).add(1);}}或者使用built-inrunner:MockitoJUnitRunner@RunWith(MockitoJUnitRunner.class)publicclassMockitoExample2{@MockprivateListmockList;@Testpublicvoidshorthand(){mockList.add(1);verify(mockList).add(1);}}更多的注解还有@Captor,@Spy,@InjectMocks10、连续调用@Test(expected=RuntimeException.class)publicvoidconsecutive_calls(){//模拟连续调用返回期望值,如果分开,则只有最后一个有效when(mockList.get(0)).thenReturn(0);when(mockList.get(0)).thenReturn(1);when(mockList.get(0)).thenReturn(2);when(mockList.get(1)).thenReturn(0).thenReturn(1).thenThrow