美文网首页
mockito读书笔记

mockito读书笔记

作者: 域外芳草之无题 | 来源:发表于2017-05-19 17:11 被阅读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返回固定值的方法

    相关文章

      网友评论

          本文标题:mockito读书笔记

          本文链接:https://www.haomeiwen.com/subject/qrgyxxtx.html