使用 JUnit 和 AssertJ 测试数组是否包含元素

Test that a array contains elements with JUnit and AssertJ

我使用 JUnit 4.12 和 AssertJ 3.11.0 进行了以下单元测试,结果很有趣。 helloTestgreenworldTestred

@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"]]>

但是为什么呢?

这是类型的问题。以下测试将通过:

@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[]