Интеграционный тест, утверждающий каждый элемент в коллекции - PullRequest
0 голосов
/ 19 октября 2018

Рассматривая IT с Spring-Boot и JUnit, который проверял бы, содержит ли коллекция, возвращаемая из базы данных, все необходимые элементы.Каков наилучший способ сделать это?

Для иллюстрации рассмотрим класс / сущность JPA, например:

class Person {

    Integer id;
    String name;
    String lastName;
    Address address;
    Account account;

}

Учтите, что идентификаторы Person, Addressи Account будет генерироваться автоматически, поэтому я не могу вывести их.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 19 октября 2018

I идентичность 3 балла:

1) Вызовите тестируемый метод , который сохраняет и сбрасывает экземпляр сущности с JpaRepository, выделенным для вашей сущности

2) Убедитесь, что ваш интеграционный тест является надежным / ценным .
Здесь важно очистить кэш первого уровня JPA (EntityManager.clear()) для проверки фактического извлечения из базы данных.Кеш может скрыть некоторую проблему в вашем отображении, которая будет видна только при обнаружении объекта в базе данных.

3) Утверждение ожидаемого поведения , при котором извлекается сохраненная сущность из БД и утверждается ее состояние согласно ожидаемому.

Для утверждения полей объекта AssertJ может вас заинтересовать.
Это не заставляет вас переопределять equals()/hashCode(), и это очень просто и имеет смысл.
Поскольку вы хотите утверждать вложенные объекты, ясоветуем использовать отдельный assertThat() по объекту.
Например:

Person person = new Person()...;
// action
personRepository.saveAndFlush(person);

// clear the first level cache
em.clear();

// assertions
Optional<Person> optPerson = personRepository.findById(person.getId());

// JUnit
Assert.assertTrue(optPerson.isPresent()); 
// AssertJ
person = optPerson.get();
Assertions.assertThat(person)
          .extracting(Person::getName, Person::getLastName)                     
          .containsExactly("expected name", "expected last name");

Assertions.assertThat(person.getAccount())
          .extracting(Account::getFoo, Account::getBar)                     
          .containsExactly("expected foo", "expected bar");

Assertions.assertThat(person.getAddress())
          .extracting(Address::getStreet, Address::getZip)                     
          .containsExactly("expected street", "expected zip");
...