[英]Hamcrest hasItem and Mockito verify inconsistency
我遇到過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
。 這需要在@Before
方法中使用MockitoAnnotations.init(this)
。
您可以使用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));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.