如何断言两个列表<string>是相等的,忽略顺序

时间:2017-03-27 20:46:21

标签: java assertj

我正在使用AssertJ,我试图断言两个List<String>包含相同的字符串,忽略了顺序。

List<String> expected = Arrays.asList("Something-6144-77.pdf", "d-6144-77.pdf", "something-6144-78.pdf", "Something-6144-8068.pdf");
List<String> actual = new ArrayList<String>();

assertThat(actual.size()).isEqualTo(expected.size());

// This line gives the error: "The method containsExactlyInAnyOrder(String...) in the type ListAssert<String> is not applicable for the arguments (List<String>)"
assertThat(actual).containsExactlyInAnyOrder(expected);

如何修复尝试使用containsExactlyInAnyOrder()时出现的下面的编译错误?

  

&#34;该方法包含类型ListAssert中的ExactlyInAnyOrder(String ...)不适用于参数(List)&#34;

4 个答案:

答案 0 :(得分:6)

答案(by jlordoby dasblinkenlight)都有效,但却是正确的解决方法。

AssertJ库中有一个方法,用于专门检查List是否包含另一个Iterable中的所有值,无论顺序如何。它被称为containsOnlyElementsOf()

  

public SELF containsOnlyElementsOf(Iterable<? extends ELEMENT> iterable)

  与ObjectEnumerableAssert.containsOnly(Object[])相同的语义:验证实际包含给定iterable的所有元素,而不包含其他任何元素。

  示例:

  Iterable<Ring> rings = newArrayList(nenya, vilya);

  // assertion will pass
  assertThat(rings).containsOnlyElementsOf(newLinkedList(nenya, vilya)) .containsOnlyElementsOf(newLinkedList(nenya, nenya, vilya, vilya));

  // assertion will fail as actual does not contain narya
  assertThat(rings).containsOnlyElementsOf(newLinkedList(nenya, vilya, narya));
  // assertion will fail as actual contains nenya   assertThat(rings).containsOnlyElementsOf(newLinkedList(vilya));

所以,这个方法就是你应该使用的方法,如下所示。您无需将List投射或转换为Array

assertThat(actual).containsOnlyElementsOf(expected);

作为旁注,你对列表大小的断言是多余的:

assertThat(actual.size()).isEqualTo(expected.size());

这已经包含在列表中包含相同元素的断言中。

最后,如果你确实需要声明一个列表有一个特定的站点,AssertJ有一个内置的方法(hasSameSizeAs()):

assertThat(actual).hasSameSizeAs(expected);

答案 1 :(得分:4)

由于该方法需要animation,因此您应该传递数组而不是列表:

String...

或使用内联项目列表调用它:

String[] expected = new String[] {
    "Something-6144-77.pdf"
,   "d-6144-77.pdf"
,   "something-6144-78.pdf"
,   "Something-6144-8068.pdf"
};

答案 2 :(得分:4)

错误消息为您提供解决方案:

The method containsExactlyInAnyOrder(String...)

String...是任意数量的字符串,但也可以作为数组传递:

assertThat(actual).containsExactlyInAnyOrder((String[]) expected.toArray(new String[expected.size()]));

此处需要强制转换,并且假设expected元素的创建与示例中的不同,给出了代码,因为将数组转换为列表并将其转换回来是没有意义的。 / p>

这里有一些文档 varargs (任意数量的参数,...):https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

答案 3 :(得分:0)

assertj的较新版本中,有一个containsExactlyInAnyOrderElementsOf正是用于此目的。 您的示例可以归结为

assertThat(actual).containsExactlyInAnyOrderElementsOf(expected);