0

我遇到了 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>while foo 方法需要一个List<B>. 有什么好的方法可以验证方法是否被正确调用?

4

2 回答 2

1

你可以使用一个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用作快捷方式,而且它可以是 aList<B>而不是只是List. 这需要MockitoAnnotations.init(this)在一个@Before方法中使用。

于 2013-06-18T16:46:53.213 回答
1

您可以使用 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));
}
于 2016-05-23T10:19:31.220 回答