我遇到过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>
。
有没有什么好方法可以正确调用该方法?
答案 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));
}