如何检查hamcrest中集合中某些项目的大小和存在

moh*_*nag 9 java junit hamcrest

我正在使用Hamcrest 1.3并试图以更紧凑的方式实现以下目标.

考虑以下测试用例:

@Test
public void testCase() throws Exception {

    Collection<String> strings = Arrays.asList(
        "string one",
        "string two",
        "string three"
    );

    // variant 1:
    assertThat(strings, hasSize(greaterThan(2)));
    assertThat(strings, hasItem(is("string two")));

    // variant 2:
    assertThat(strings, allOf(
        hasSize(greaterThan(2)),
        hasItem(is("string two"))
    ));
}
Run Code Online (Sandbox Code Playgroud)

这里的目标是检查集合的大小和要包含的一些特定项目.

在第一种变化是可能的并且被接受的情况下,这并不总是那么容易,因为集合本身可能是其他一些操作的结果,因此使用allOf操作对其进行所有操作更有意义.这是在上面的第二个变体中完成的.

但是,包含第二个变体的代码将导致以下编译时错误:

error: no suitable method found for allOf(Matcher<Collection<? extends Object>>,Matcher<Iterable<? extends String>>)
Run Code Online (Sandbox Code Playgroud)

实际上是否有任何特定的方法来测试Hamcrest中使用单次操作(例如allOf)的集合的大小和项目?

eee*_*eee 12

我认为编译器无法理清泛型.以下是为我工作(JDK 8u102):

assertThat(strings, Matchers.<Collection<String>> allOf(
    hasSize(greaterThan(2)),
    hasItem(is("string two"))
));
Run Code Online (Sandbox Code Playgroud)


fyw*_*ywe 5

我知道这个问题已经很老了,但我仍然想回答它,以防有人需要解释。

如果您想使用,allOf(...)只需确保嵌套匹配器返回类型匹配。在您的测试用例中hasSize返回org.hamcrest.Matcher<java.util.Collection<? extends T>>hasItem产生org.hamcrest.Matcher<java.lang.Iterable<? super T>>. 在这种情况下,我建议使用iterableWithSize(int size)where return type is Matcher<java.lang.Iterable<T>>,所以你可以这样做:

assertThat(strings, allOf( iterableWithSize(greaterThan(2)), hasItem("string two") ) );