如何检查 hamcrest 集合中某些物品的大小和是否存在

2022-09-03 13:31:22

我正在使用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"))
    ));
}

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

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

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

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

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


答案 1

我认为编译器无法整理泛型。以下内容对我有用 (JDK 8u102):

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

答案 2

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

如果要使用,只需确保嵌套匹配器返回类型匹配即可。在您的测试用例中返回,但产生 .在这种情况下,我建议使用迭代WithSize(int size),其中返回类型是,所以你可以这样做:allOf(...)hasSizeorg.hamcrest.Matcher<java.util.Collection<? extends T>>hasItemorg.hamcrest.Matcher<java.lang.Iterable<? super T>>Matcher<java.lang.Iterable<T>>

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


推荐