您的位置:首页 > 其它

Mockito 其他使用

2018-01-09 18:07 204 查看
上篇文章介绍了几种使用Mockito书写Unit Test code的常用场景。这篇文章介绍接种Mockito的其他使用情况。

注解

@Mock
private List mockList;


这样就不用每次在@Test方法中,调用mock方法模拟对象了, 直接调用mockList方法即可

注意:需要先在setUp()方法中调用一下这行代码 MockitoAnnotations.initMocks(this);

使用Spy监控真实对象

使用spy来监控真实的对象,需要注意的是此时我们需要谨慎的使用when-then语句,而改用do-when语句

@Test(expected = IndexOutOfBoundsException.class)
public void spyOnRealObjects(){
List list = new LinkedList();
List spy = spy(list);
//下面预设的spy.get(0)会报错,因为会调用真实对象的get(0),所以会抛出越界异常
//when(spy.get(0)).thenReturn(3);

//使用doReturn-when可以避免when-thenReturn调用真实对象api
doReturn(999).when(spy).get(999);
//预设size()期望值
when(spy.size()).thenReturn(100);
//调用真实对象的api
spy.add(1);
spy.add(2);
assertEquals(100,spy.size());
assertEquals(1,spy.get(0));
assertEquals(2,spy.get(1));
verify(spy).add(1);
verify(spy).add(2);
assertEquals(999,spy.get(999));
spy.get(2);
}


利用ArgumentCaptor(参数捕获器) 捕获方法参数进行验证

在某些场景中,不光要对方法的返回值和调用进行验证,同时需要验证一系列交互后所传入方法的参数。那么我们可以用参数捕获器来捕获传入方法的参数进行验证,看它是否符合我们的要求。

ArgumentCaptor介绍

通过ArgumentCaptor对象的forClass(Class clazz)方法来构建ArgumentCaptor对象。然后便可在验证时对方法的参数进行捕获,最后验证捕获的参数值。如果方法有多个参数都要捕获验证,那就需要创建多个ArgumentCaptor对象处理。

ArgumentCaptor的Api

argument.capture() 捕获方法参数

argument.getValue() 获取方法参数值,如果方法进行了多次调用,它将返回最后一个参数值

argument.getAllValues() 方法进行多次调用后,返回多个参数值

应用实例

@Test
public void argumentCaptorTest() {
List mock = mock(List.class);
List mock2 = mock(List.class);
mock.add("John");
mock2.add("Brian");
mock2.add("Jim");

ArgumentCaptor argument = ArgumentCaptor.forClass(String.class);

verify(mock).add(argument.capture());
assertEquals("John", argument.getValue());

verify(mock2, times(2)).add(argument.capture());

assertEquals("Jim", argument.getValue());
assertArrayEquals(new Object[]{"Brian","Jim"},argument.getAllValues().toArray());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: