Hamcrest hasItem和Mockito验证不一致

时间:2013-06-18 16:30:33

标签: java junit mockito hamcrest

我遇到过hamcrest和mockito的问题。 这是我正在尝试做的事情:

public class A{
     public void foo(List<B> arg){
          return;
     }
}

public BMatcher extends BaseMatcher<B>{
 //Some impl...
}

在我的测试中,我想做一些像

这样的事情
A a = mock(A.class);
B expected = new B();
Mockito.verify(a).foo(argThat(JUnitMatchers.hasItem(new BMatcher(expected)));

但是,hasItem匹配器返回Iterable<B>,而foo方法需要List<B>。 有没有什么好方法可以正确调用该方法?

2 个答案:

答案 0 :(得分:1)

您可以使用ArgumentCaptor

 @Captor
 ArgumentCaptor<List<B>> captor;

 // then in test
 ...
 verify(a).foo(captor.capture());
 List<B> values = captor.getValue();
 assertThat(values, IsIterableContainingInOrder.containingInOrder(new BMatcher(expected));
 ...

我使用@Captor作为快捷方式,也可以使用List<B>代替List。这需要在MockitoAnnotations.init(this)方法中使用@Before

答案 1 :(得分:1)

您可以使用Mockito Matchers类中的'argThat'方法将hamcrest Matcher转换为mockito参数匹配器:

import static org.mockito.Matchers.argThat;
import org.hamcrest.Matchers;
import org.hamcrest.Matcher;
//....
public static <T> List<T> listWithItem(Matcher<T> m)
{
    return (List<T>)argThat(Matchers.hasItem(m));
}