【问题标题】:How to check for size AND presence of some items in collections in hamcrest如何检查 hamcrest 集合中某些项目的大小和存在
【发布时间】:2016-10-21 12:40:51
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: java junit hamcrest


【解决方案1】:

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

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

【讨论】:

  • 这确实有效,即使这有点偏离 Hamcrest 的基本可读性理念。
【解决方案2】:

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

如果您想使用allOf(...),请确保嵌套匹配器返回类型匹配。在您的测试用例中 hasSize 返回 org.hamcrest.Matcher&lt;java.util.Collection&lt;? extends T&gt;&gt;hasItem 产生 org.hamcrest.Matcher&lt;java.lang.Iterable&lt;? super T&gt;&gt;。 在这种情况下,我建议使用返回类型为Matcher&lt;java.lang.Iterable&lt;T&gt;&gt;iterableWithSize(int size),因此您可以这样做:

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

【讨论】:

    【解决方案3】:

    猜测:你不会通过使用现有的匹配器到达那里。

    但是编写你自己的匹配器......只要你理解了事情是如何组合在一起的,只需要几分钟。

    也许你看看我的另一个answer;我在这里给出了一个完整的例子,一个人如何编写自己的匹配器。那时,我大概花了 15 分钟。虽然我以前从未编写过自定义匹配器。

    【讨论】:

    • 我在编写自己的匹配器时没有问题,但在我看来这是一件非常必要的事情,我认为应该存在某种方法来做到这一点。
    【解决方案4】:

    有一种简单但老实说有点隐蔽的方法来测试列表大小和项目匹配:contains

    contains 使用一个 Matcher,检查可迭代对象(例如列表)是否只有一个项目并且该项目与给定的 Matcher 匹配

    contains(E... items)(arbitrary number of Matchers) 检查可迭代对象是否具有与给定匹配器数量一样多的项目,并且每个项目与给定匹配器之一匹配。注意 Matchers 不能匹配多个项目,否则结果可能与您预期的不同

    总而言之,contains 隐式检查大小是否正确(通过给定的匹配器数量)

    如果您对给定的尺寸匹配不感兴趣,请使用hasItem/hasItems

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-05
      • 2012-12-08
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多