我正在尝试测试集合中是否包含toString()方法返回特定String的项目。我尝试使用出色的Hamcrest匹配类,通过将contains与Matchers.hasToString结合使用,但是以某种方式,即使它存在于集合中,它的Matchers.contains也无法匹配该项目。

这是一个例子:

class Item {

    private String name;

    public Item(String name){
        this.name = name;
    }

    public String toString(){
        return name;
    }
}

// here's a sample collection, with the desired item added in the end
Collection<Item> items = new LinkedList<Item>(){{
    add(new Item("a"));
    add(new Item("b"));
    add(new Item("c"));
}};

Assert.assertThat(items, Matchers.contains(Matchers.hasToString("c")));

上面的声明不成功。这是消息:
java.lang.AssertionError:
Expected: iterable containing [with toString() "c"]
     but: item 0: toString() was "a"
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
    at org.junit.Assert.assertThat(Assert.java:865)
    at org.junit.Assert.assertThat(Assert.java:832)

看起来Matchers.contains匹配器尝试遍历列表,但是Matchers.hasToString匹配器在第一项中失败,并使其余的迭代无效。 Hamcrest javadoc for Matchers.contains说:

“为Iterables创建一个匹配项,该匹配项在一次通过检查的Iterable时产生一个满足指定匹配项的项目。对于正匹配,检查的Iterable只能产生一项。”

难道我做错了什么?

最佳答案

我认为您正在寻找Matchers.hasItem(..)

Assert.assertThat(items, Matchers.hasItem(Matchers.hasToString("c")));

哪个州


Matchers.contains,如您所说,



在我看来,这就是说Iterable中应该只有一个元素。

10-07 16:21
查看更多