关于java:Hamcrest hasItem和Mockito验证不一致

Hamcrest hasItem and Mockito verify inconsistency

我遇到了有关Hamcrest和Mockito的问题。
这是我正在尝试做的事情:

1
2
3
4
5
6
7
8
9
public class A{
     public void foo(List arg){
          return;
     }
}

public BMatcher extends BaseMatcher{
 //Some impl...
}

在测试中,我想做类似

的事情

1
2
3
A a = mock(A.class);
B expected = new B();
Mockito.verify(a).foo(argThat(JUnitMatchers.hasItem(new BMatcher(expected)));

但是,hasItem匹配器返回Iterable,而foo方法需要List
有什么好的方法可以验证方法是否正确调用?


您可以在Mockito Matchers类中使用'argThat'方法将hamcrest Matcher转换为模仿参数Matcher:

1
2
3
4
5
6
7
8
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));
}


您可以使用ArgumentCaptor

1
2
3
4
5
6
7
8
9
 @Captor
 ArgumentCaptor<List> captor;

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

我将@Captor用作快捷方式,并且也可能是List而不是List。这要求在@Before方法中使用MockitoAnnotations.init(this)