我遇到了有关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>
。有什么好的方法可以验证方法是否正确调用?
最佳答案
您可以使用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
。