Два способа идентифицировать один и тот же объект для упрощения тестирования - PullRequest
0 голосов
/ 03 июня 2018

У меня есть класс, например

@Setter
@EqualsAndHashCode(of = "id")
@Entity
public class MovieBoxOfficeEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Setter(AccessLevel.NONE)
        private Long id;
}

, в котором идентификатор генерируется автоматически без ручной настройки.У меня также есть класс с методом

@Entity
@Table(name = "movies")
public class MovieEntity {

       List<MovieBoxOffice> boxOffices = new ArrayList<>();

       public void addBoxOffice(MovieBoxOffice boxOffice) throws ResourceConflictException {
            if (this.boxOffices.contains(boxOffice)) {
                 throw new ResourceConflictException("A box office with id " + boxOffice.getId() + " is already added");
            }
           this.boxOffices.add(boxOffice);
      }
}

. Есть проблема с тестированием метода addBoxOffice, потому что сравнение MovieBoxOfficeEntity объектов выполняется с использованием ID и IDгенерируется только автоматически при записи в базу данных и не может быть установлен вручную.

Мне пришла в голову идея добавить поле uniqueId в класс MovieBoxOfficeEntity и добавить его в аннотацию @EqualsAndHashCode

@Setter
@EqualsAndHashCode(of = {"id", "uniqueId"})
@Entity
public class MovieBoxOfficeEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Setter(AccessLevel.NONE)
        private Long id;

        private String uniqueId = UUID.randomUUID().toString();
}

тогда я могу проверить таким образом

@Test(expected = ResourceConflictException.class)
public void canAddBoxOffice() throws ResourceConflictException{
    final String id = UUID.randomUUID().toString();
    final MovieBoxOfficeEntity boxOffice = new MovieBoxOfficeEntity();
    boxOffice.setUniqueId(id);

    this.movieEntity.addBoxOffice(boxOffice);
    this.movieEntity.addBoxOffice(boxOffice);
}

таким образом, объект boxOffice будет иметь

id: null
uniqueId: some generated UUID

, и сравнение объектов будетпровести сравнение uniqueId.

Что вы думаете о создании поля uniqueId только для проверки методов сущностей?

1 Ответ

0 голосов
/ 03 июня 2018

Добавление uniqueId может привести к коллизиям.Предположим, есть два искателя.Когда будет создан их результат, для одной и той же строки в базе данных будут созданы два экземпляра.Они будут иметь одинаковый id , но разные uniqueId .Значит, два объекта имеют одинаковый первичный ключ, но равно return false .Это может привести к ошибкам в логике приложения и в реализации JPA.

Вы можете переопределить равно .Но используйте атрибуты сущностей, которые связаны с вашей таблицей, а не случайно сгенерированные UUID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...