mockito读书笔记

2017-05-19  本文已影响0人  域外芳草之无题

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返回固定值的方法

上一篇下一篇

猜你喜欢

热点阅读