如何使用hamcrest包含来比较2个列表?

时间:2016-03-14 18:32:55

标签: java junit hamcrest

为什么这个测试失败了?我知道当你传入用逗号分隔的单个字符串时,包含有效,但我想看看是否可以传入整个字符串列表。我只想确保列表1包含列表2的所有内容。

@Test
public void testContains() {
    String expected1 = "hello";
    String expected2 = "goodbye";
    List<String> expectedStrings = new ArrayList<>();
    expectedStrings.add(expected1);
    expectedStrings.add(expected2);
    List<String> actualStrings = new ArrayList<>();
    actualStrings.add(expected1);
    actualStrings.add(expected2);
    assertThat(actualStrings, contains(expectedStrings));
}

使用这个断言是否可以接受?

assertThat(actualStrings, is(expectedStrings));

2 个答案:

答案 0 :(得分:2)

没有重载的contains方法,它采用了预期值列表。

在声明中assertThat(actualStrings, contains(expectedStrings)) 调用以下方法(在Matchers类中):

<E> org.hamcrest.Matcher<java.lang.Iterable<? extends E>> contains(E... items)

基本上你说你期望一个包含一个元素的列表,这个元素是expectedStrings但实际上它是expected1EList<String>类型而不是String)。要验证将以下内容添加到应该通过的测试中:

List<List<String>> listOfactualStrings = new ArrayList<>();
listOfactualStrings.add(actualStrings);
assertThat(listOfactualStrings, contains(expectedStrings));

要使断言起作用,您必须将列表转换为数组:

assertThat(actualStrings, contains(expectedStrings.toArray()));

答案 1 :(得分:0)

如果要为列表中的每个项目应用匹配器,可以使用everyItem匹配器,如下所示:

everyItem(not(isEmptyOrNullString()))