mockito读书笔记
1、模拟抛出异常
dothrow(newRuntimeException()).when(mocklist).clear();
2、验证调用顺序
InOrder inorder = inorder(list);
inorder.verify(list).add("hyt");
inOrder.verifyNoInteractions();//验证list在调用add("hyt")之后有没有别的调用
inorder.verify(list).add("huangyt")
验证list调用add("hyt")在add("huangyt")之前被调用
3、确认方法从来没被调用
verify(mockone,never()).add("two");
4、验证多余的方法
verifyNoMoreInteraction(list);
如果list被模拟出来并且有方法没有被验证,则该验证成功,否则失败。
5、@mock注解的方式模拟一个对象值
注意:该注解在基类或者一个测试的启动类里加入:
MockitoAnnotations.initMocks(test);
解决办法:可以在测试类上加入MockitoJunitRunner ,eg:@RunWith(MockitoJUnitRunner.class)
也可以在加一个规则 eg:
@Rule public MockitoRule rule = MockitoJUnit.rule();
6、桩的连续调用:当同一个方法顺序调用时返回的值不一样时,可以使用连续调用
eg:when(mock.someMethod("some arg")) .thenThrow(new RuntimeException()) .thenReturn("foo");
eg:when(mock.someMethod("some arg")) .thenReturn("one", "two", "three");
7、mock对象的创建:
1、mock(class classToMock)
2、mock(class classToMock,String name)//name是mock对象的名字,这样的好处是测试失败时会将mock的对象打印出来,对于final、匿名类、java基本类型无法mock
8、对于方法调用为空的方法:
一般使用:doNothing().when(List).remove();
or doNothing().doThrow(new RuntimeException()).when(List).remove();
9、查询没有交互的mock对象
verifyzeroInteractions(),
10、验证对象方法的调用次数:
never()没有被调用过,和times(0)相同
atLeast(N)至少被调用N次
atLeastOnce()相当于atLeast(1)
atMost(N)最多被调用N次
eg:verify(list,atMost(1)).add(1);
11、mock对象的重置:
reset(list)//重置之后,mock对象将回到最初被 创建的状态,没有任何stubbing和方法调用
12、answer接口(方法预期回调接口)
需要自定义方法执行返回结果,其中invocationOnMock对象
13、RETURNS_SMART_NULLS
创建一个mock对象,如果调用为stubbing的方法是不会报错,而是返回相应的数据:
eg:List mock = mock(List.class, RETURNS_SMART_NULLS);
System.out.println(mock.get(0));//此时会返回list.get(0)
System.out.println(mock.toArray().length);//此时返回0
14、RETURNS_DEEP_STUBS
假如Account对象有一个属性是RailwayTicket,如果mock一个Account对象时使用RETURNS_DEEP_STUBS参数时,系统会自动mock一个RailwayTicket对象,如果没使用改参数,将会报空指针异常
注意:如果链中包含任何原始类或者最终类时,该功能将不起作用。
eg:
Account account = mock(Account.class,RETURNS_DEEP_STUBS);
when(account.getRailwayTicket().getDestination()).thenReturn("hangzhou");
account.getRailwayTicket().getDestination();
verify(account.getRailwayTicket(),atLeast(1)).getDe
15、mock反射
一个接口方法中调用了N个上下游服务,需要将其中的一个服务mock掉,其余服务按实际业务调用
eg:
BidService bidService = Mockito.mock(BidService.class);
when(bidService.packageBidSynchronization(any())).thenReturn(response);
try{
ReflectionTestUtils.setField(bidInfoBiz,"bidService",bidService);
}catch(Exception e) {
e.printStackTrace();
}
16、doCallRealMethod()
若一个接口有N个方法,某个方法期望返回期望结果,别的方法按实际调用逻辑执行
DepositRepurchaseDebtInvoker depositRepurchaseDebtInvoker =mock(DepositRepurchaseDebtInvokerImpl.class);//被mock的类
when(depositRepurchaseDebtInvoker.check(any())).thenCallRealMethod();//按实际业务调用的类,返回有返回值
Mockito.doCallRealMethod().when(depositRepurchaseDebtInvoker).save(any(),any());//按实际业务调用的类,方法无返回值
Mockito.doCallRealMethod().when(depositRepurchaseDebtInvoker).finish(any());//mock返回固定值的方法