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

Cat*_*ish 9 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);
Run Code Online (Sandbox Code Playgroud)

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

"ListAssert类型中的方法containsExactlyInAnyOrder(String ...)不适用于参数(List)"

Mag*_*lex 9

这两个答案(通过jlordodasblinkenlight)都有效,但它们是解决方法,而不是正确的方法.

AssertJ库中有一个方法,用于专门检查a是否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));

所以,这个方法就是你应该使用的方法,如下所示.没有必要强制转换或转换ListArray.

assertThat(actual).containsOnlyElementsOf(expected);
Run Code Online (Sandbox Code Playgroud)

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

assertThat(actual.size()).isEqualTo(expected.size());
Run Code Online (Sandbox Code Playgroud)

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

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

assertThat(actual).hasSameSizeAs(expected);
Run Code Online (Sandbox Code Playgroud)


das*_*obu 8

在较新版本的assertj中,有一个containsExactlyInAnyOrderElementsOf正是用于此目的。你的例子归结为

assertThat(actual).containsExactlyInAnyOrderElementsOf(expected);
Run Code Online (Sandbox Code Playgroud)


jlo*_*rdo 5

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

The method containsExactlyInAnyOrder(String...)
Run Code Online (Sandbox Code Playgroud)

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

assertThat(actual).containsExactlyInAnyOrder((String[]) expected.toArray(new String[expected.size()]));
Run Code Online (Sandbox Code Playgroud)

强制转换在这里是必需的,并且代码是在假定expected元素创建与示例不同的前提下给出的,因为将数组转换为列表然后返回并不有意义。

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