我正在尝试测试集合中是否包含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
中应该只有一个元素。