mockito-ArgumentMatcher

from:http://hotdog.iteye.com/blog/911584

Mockito参数匹配器的实现使用了Hamcrest框架(一个书写匹配器对象时允许直接定义匹配规则的框架,网址:http://code.google.com/p/hamcrest/)。它已经提供了许多规则供我们使用, Mockito在此基础上也内建了很规则。但有时我们还是需要更灵活的匹配,所以需要自定义参数匹配器。

ArgumentMatcher抽象类
自定义参数匹配器的时候需要继承ArgumentMatcher抽象类,它实现了Hamcrest框架的Matcher接口,定义了describeTo方法,所以我们只需要实现matches方法在其中定义规则即可。
下面自定义的参数匹配器是匹配size大小为2的List:

Java代码   收藏代码
  1. class IsListOfTwoElements extends ArgumentMatcher<List> {  
  2.     public boolean matches(Object list) {  
  3.         return ((List) list).size() == 2;  
  4.     }  
  5. }  
  6.   
  7. @Test  
  8. public void argumentMatchersTest(){  
  9.     List mock = mock(List.class);  
  10.     when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);  
  11.        
  12.     mock.addAll(Arrays.asList("one""two""three"));  
  13.     verify(mock).addAll(argThat(new IsListOfTwoElements()));  
  14. }  

argThat(Matcher<T> matcher)方法用来应用自定义的规则,可以传入任何实现Matcher接口的实现类。上例中在stubbing和verify addAll方法时通过argThat(Matcher<T> matcher),传入了自定义的参数匹配器IsListOfTwoElements用来匹配size大小为2的List。因为例子中传入List的元素为三个,所以测试将失败。

较复杂的参数匹配将会降低测试代码的可读性。有时实现参数对象的equals()方法是个不错的选择(Mockito默认使用equals()方法进行参数匹配),它可以使测试代码更为整洁。另外,有些场景使用参数捕获器(ArgumentCaptor)要比自定义参数匹配器更加合适。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值