`
hotdog
  • 浏览: 281994 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

学习Mockito - 自定义参数匹配器

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

ArgumentMatcher抽象类
自定义参数匹配器的时候需要继承ArgumentMatcher抽象类,它实现了Hamcrest框架的Matcher接口,定义了describeTo方法,所以我们只需要实现matches方法在其中定义规则即可。
下面自定义的参数匹配器是匹配size大小为2的List:
class IsListOfTwoElements extends ArgumentMatcher<List> {
    public boolean matches(Object list) {
        return ((List) list).size() == 2;
    }
}

@Test
public void argumentMatchersTest(){
    List mock = mock(List.class);
    when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
     
    mock.addAll(Arrays.asList("one", "two", "three"));
    verify(mock).addAll(argThat(new IsListOfTwoElements()));
}

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics