Hamcrest提供了许多用于声明集合内容的匹配器。所有这些案件都通过了:
Collection<String> c = ImmutableList.of("one", "two", "three");
assertThat(c, hasItems("one", "two", "three");
assertThat(c, contains("one", "two", "three");
assertThat(c, containsInAnyOrder("one", "two", "three");
hasItems
,contains
和containsInAnyOrder
有何不同?
答案 0 :(得分:48)
连续传递检查的Iterable yield至少一个项目,该项目等于指定
items
中的相应项目。
也就是说,它确保集合包含至少这些项目,以任何顺序。所以,
assertThat(c, hasItems("one", "two"));
也会通过,额外的项目会被忽略。和
assertThat(c, hasItems("three", "two", "one"));
也会过去。
对检查的
Iterable
进行单次传递会产生一系列项目,每个项目在逻辑上等于指定项目中的相应项目。对于肯定匹配,检查的可迭代必须与指定项的数量具有相同的长度。
因此,它确保该集合包含完全这些项目:
assertThat(c, contains("one", "two")); // Fails
这会失败,因为剩余的"three"
不匹配。
assertThat(c, contains("three", "two", "one")); // Fails
此操作失败,因为相应的项目不匹配。
另一个相关的匹配器,containsInAnyOrder
,checks确切地说这些项目存在,但是按任何顺序:
为
Iterables
创建一个与订单无关的匹配器,当对检查的Iterable
进行单次传递时会产生一系列项目,每个项目在逻辑上等于指定项目中任何位置的一项。
缺少项目的测试失败:
assertThat(c, containsInAnyOrder("one", "two")); // Fails
但是不同顺序的所有项目都会通过:
assertThat(c, containsInAnyOrder("three", "two", "one"));