Есть у меня `UserService` класс, в котором есть метод:
public Spliterator<UserEntity> getAll() {
return userRepo.findAll().spliterator();
}
К этому методу я хочу написать тест. В тестах у меня подтягивается тестовая база данных, так что я точно знаю, что этот метод должен вернуть. Поэтому мой тест имеет вид:
@Test
public void testFindAllUsers() {
// Create model
List<UserEntity> modelList = List.of(
UserEntity.builder().id(1L).login("test").password("aA123456").build(),
UserEntity.builder().id(2L).login("test2").password("aA123456").build()
);
// Get result
List<UserEntity> resultList = StreamSupport.stream(userService.getAll(), false)
.toList();
// Compare
// ...
}
Собственно весь мой вопрос заключается в реализации этапа "Compare".
Сначала решил реализовать equals() в UserEntity:
/**
* Cтандартная реализация equals() от IntelliJ IDEA. В Lombok похожая реализация
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserEntity entity = (UserEntity) o;
if (getId() != null ? !getId().equals(entity.getId()) : entity.getId() != null) return false;
if (getLogin() != null ? !getLogin().equals(entity.getLogin()) : entity.getLogin() != null) return false;
if (getPassword() != null ? !getPassword().equals(entity.getPassword()) : entity.getPassword() != null)
return false;
//...
}
Но если сравнивать все поля, то будут потягиваться все lazy поля, на что все в этих ваших интернетах ругаются, что так нельзя реализовывать equals().
Далее я решил сравнивать по полям прям в тесте.:
// Compare
for (int i = 0; i < modelList.size(); i++) {
var model = modelList.get(i);
var result = modelList.get(i);
assertEquals(model.getId(), result.getId());
assertEquals(model.getLogin(), result.getLogin());
assertEquals(model.getPassword(), result.getPassword());
}
Но это как-то слишком в лоб и не элегантно.
Есть ли способ лучше?