使用ArgumentCaptor <list>和hamcrest.hasSize

时间:2015-10-14 12:29:26

标签: java mockito hamcrest

我使用Mockito和Hamcrest在Java中进行单元测试。

我经常使用Hamcrests hasSize断言某些集合具有一定的大小。几分钟前,我正在编写一个测试,我正在捕获List调用(替换名称):

public void someMethod(A someObject, List<B> list)

测试:

@Test
public void test() {
    // (...)
    ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
    verify(someMock).someMethod(same(otherObject), captor.capture());
    assertThat(captor.getValue().size(), is(2)); // This works
    assertThat(captor.getValue(), hasSize(2)); // This gives a compile error
    // TODO more asserts on the list
}

问题: 测试以第一个assertThat运行为绿色,并且可能还有其他方法可以解决此问题(例如,实施ArgumentMatcher<List>),但因为我总是使用hasSize,我和#39;我想知道如何解决这个编译错误:

The method assertThat(T, Matcher<? super T>) in the type MatcherAssert is not applicable for the arguments (List, Matcher<Collection<? extends Object>>)

2 个答案:

答案 0 :(得分:5)

解决此问题的一种方法是使用mockito annotations定义您的捕获者,例如:

@RunWith(MockitoJUnitRunner.class)
public class MyTestClass {

    @Captor
    private ArgumentCaptor<List<B>> captor; //No initialisation here, will be initialized automatically

    @Test
    public testMethod() {
        //Testing...
        verify(someMock).someMethod(same(otherObject), captor.capture());
        assertThat(captor.getValue(), hasSize(2));
    }
}

答案 1 :(得分:1)

我自己找到了一个可能的解决方案:

assertThat((List<B>) captor.getValue(), hasSize(2));