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

时间:2018-08-23 14:22:59

标签: java junit assertj

我对JUnit 4.12和AssertJ 3.11.0进行了以下单元测试,并获得了有趣的结果。 helloTestgreen,而worldTestred

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

但是为什么?

1 个答案:

答案 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[]