簡體   English   中英

Hamcrest hasItem和Mockito驗證不一致

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM