Hamcrest的hasItems,contains和containsInAnyOrder有何不同?

时间:2015-11-21 06:41:37

标签: hamcrest

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");

hasItemscontainscontainsInAnyOrder有何不同?

1 个答案:

答案 0 :(得分:48)

hasItems checks

  

连续传递检查的Iterable yield至少一个项目,该项目等于指定items中的相应项目。

也就是说,它确保集合包含至少这些项目,以任何顺序。所以,

assertThat(c, hasItems("one", "two"));

也会通过,额外的项目会被忽略。和

assertThat(c, hasItems("three", "two", "one"));

也会过去。

contains checks

  

对检查的Iterable进行单次传递会产生一系列项目,每个项目在逻辑上等于指定项目中的相应项目。对于肯定匹配,检查的可迭代必须与指定项的数量具有相同的长度。

因此,它确保该集合包含完全这些项目:

assertThat(c, contains("one", "two")); // Fails

这会失败,因为剩余的"three"不匹配。

assertThat(c, contains("three", "two", "one")); // Fails

此操作失败,因为相应的项目不匹配。

另一个相关的匹配器,containsInAnyOrderchecks确切地说这些项目存在,但是按任何顺序:

  

Iterables创建一个与订单无关的匹配器,当对检查的Iterable进行单次传递时会产生一系列项目,每个项目在逻辑上等于指定项目中任何位置的一项。

缺少项目的测试失败:

assertThat(c, containsInAnyOrder("one", "two")); // Fails

但是不同顺序的所有项目都会通过:

assertThat(c, containsInAnyOrder("three", "two", "one"));