我对JUnit 4.12和AssertJ 3.11.0进行了以下单元测试,并获得了有趣的结果。 helloTest
是green
,而worldTest
是red
。
@Test
public void helloTest() {
Object[] array = new Object[2];
String[] firstElement = new String[]{"Hello"};
String[] secondElement = new String[]{"World"};
array[0] = firstElement;
array[1] = secondElement;
assertThat(array).containsExactlyInAnyOrder(firstElement, secondElement);
}
@Test
public void worldTest() {
Object[] array = new Object[1];
String[] element = new String[]{"Hello"};
array[0] = element;
assertThat(array).containsExactlyInAnyOrder(element);
}
AssertJ的结果是
java.lang.AssertionError:
Expecting:
<[["Hello"]]>
to contain exactly in any order:
<["Hello"]>
elements not found:
<["Hello"]>
and elements not expected:
<[["Hello"]]>
但是为什么?
答案 0 :(得分:1)
这是类型问题。以下测试将通过:
@Test
public void worldTest() {
String[][] array = new String[1][];
String[] element = new String[]{"Hello"};
array[0] = element;
assertThat(array).containsExactlyInAnyOrder(element);
}
您的worldTest
失败,因为您试图断言类型Object[]
的对象包含类型String[]
的元素。您正在使用带有以下声明的方法进行此声明:
ObjectArrayAssert<ELEMENT> containsExactlyInAnyOrder(ELEMENT... values)
此方法期望传入类型与正在检查的类型匹配。在上面的示例中,这是正确的,因此测试通过了。在您的worldTest
版本中,这是不正确的,因为一种类型是String[]
,而另一种类型是Object[]
。