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");