Проверьте, что массив содержит элементы с JUnit и AssertJ

У меня есть следующие модульные тесты с 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"]]>

Но почему?


person Quang Nguyen    schedule 23.08.2018    source источник


Ответы (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[].

person glytching    schedule 23.08.2018