我遇到了有关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

10-07 15:23