Соотношение AssertJ и Hamcrest (только для Spring MVC Test): Как проверить каждый элемент POJO коллекции (с датами) - PullRequest
0 голосов
/ 29 апреля 2018

Для Spring Framework приложения, о тестировании:

Если в AssertJ возможно применить следующее для коллекции :

.containsExactly(tuple("087", "Peter", "Jordani", parse("1980-01-01")),
                 ...
                 tuple("088", "Isaias", "Jordano", parse("1980-01-01")))

Что может быть лучшим эквивалентным приближением этих трех методов:

  • containsExactly
  • tuple
  • parse

Применяется в:

 .andExpect(model().attribute("personas", ???)

Я провел исследование в Google:

  • о коллекциях есть образцы для простых коллекций (String, Integer с hasItems)
  • о датах, работает только с Date объектами, конечно, того же типа, но не с String тоже.

1 Ответ

0 голосов
/ 04 мая 2018

Пожалуйста, посмотрите на эти примеры тестов:

public class Test {
        private List<Person> personList;
        private Person peter = new Person("087", "Peter", parse("1980-01-01"));
        private Person john = new Person("081", "John", parse("1980-01-22"));

        @BeforeEach
        void setup() {
            personList = new ArrayList<>();
            personList.add(peter);
            personList.add(john);
        }

        @Test
        void assertjTest() {
            assertThat(personList).extracting("age", "name", "date")
                    .containsExactly(
                            tuple("087", "Peter", parse("1980-01-01")),
                            tuple("081", "John", parse("1980-01-22"))
                    );
        }

        @Test
        void hamcrestTest() {
            org.hamcrest.MatcherAssert.assertThat(personList,
                    contains(
                            allOf(
                                    hasProperty("age", is("087")),
                                    hasProperty("name", is("Peter")),
                                    hasProperty("date", is(parse("1980-01-01")))
                            ),
                            allOf(
                                    hasProperty("age", is("081")),
                                    hasProperty("name", is("John")),
                                    hasProperty("date", is(parse("1980-01-22")))
                            )
                    ));

        }
}

А давайте подробнее рассмотрим:

containsExactly

contains метод является альтернативой для него. Принимая во внимание, что hasItem больше похоже на assertj.contains.

кортеж

Может быть заменен комбинацией allOf и hasProperty. На мой взгляд, это выглядит некрасиво, и я бы подумал только об использовании new Person("a","b","c"). Если у вас нет дополнительных полей, которые вы не хотите проверять.

синтаксический анализ

Здесь я только что использовал один и тот же метод для них обоих. Если вы посмотрите на него более точно, вы заметите, что этот метод не имеет ничего общего с сопоставителями. Это просто анализ строки на сегодняшний день с использованием new SimpleDateFormat("yyyy-MM-dd"). Если вы не хотите использовать assertj's, вы можете легко извлечь его в некоторый класс утилит.

...