Как сравнить класс, аннотированный полем @Entity по полю, не снижая производительность сохранения объекта в БД? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть класс БД, помеченный @Entity в Java.

Я хочу сравнить 2 экземпляра класса, который я хочу сравнить по полю, но получить ошибку от Hamcrest, что объектыне равный.Он сохраняется, пока я не сгенерирую equals и hashCode в Eclipse.

Структура сущности следующая:

@Entity
@Table(name = "book")
public class Book extends BaseEntity {

  @NotNull
  @Column
  private String title;
}

и

@MappedSuperClass
class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

}

Для простоты я опустил все методы получения и установки.

Пример кода, как я использую сущность выше:

public void updateBookTitles(bookIds) {
  List<Book> books = bookRepository.findByBookIds(bookIds);

  books.forEach((book) -> {
    book.setTitle("Example: " + book.getTitle());
  });
  bookRepository.saveAll(books);
}

При тестировании этого:

@Test
public void updateSingleBookTitle() {
    Book book = new Book();
    book.setId(1L);
    book.setTitle("Stack Overflow manual");

    when(bookRepository.findByBookIds(Arrays.asList(1L))).thenReturn(Arrays.asList(book));

    updateBookTitles(Arrays.asList(1L));

    Book expectedBook = new Book();
    expectedBook.setId(1L);
    expectedBook.setTitle("Stack Overflow manual");

    verify(bookRepository, times(1)).saveAll(Arrays.asList(expectedBook))
}

Поэтому вопрос у меня есть.Есть ли способ, кроме автогенерации equals и hashCode, чтобы объекты были равны во время тестирования, а также не снижать производительность при сохранении в базе данных.Насколько я понимаю, в данный момент объекты проверяются полем id не всеми полями.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вы можете использовать samePropertyValuesAs метод:

Book book1 = new Book();
Book book2 = new Book();
assertThat(book1, samePropertyValuesAs(book2));

Это будет сравнивать ваши объекты поле за полем и выполнять утверждения о равенстве их друг с другом.Если вам нужно игнорировать некоторые поля - посмотрите на Shazamcrest - многоразовые устройства для определения соответствия Hamcrest, подходящие для автоматического тестирования .


ОБНОВЛЕНИЕ 1 :

Попробуйте использовать следующий код:

verify(bookRepository, times(1)).saveAll(argThat(new ArgumentMatcher<List<Book>>() {
            @Override
            public boolean matches(Object argument) {
                List<Book> bookToCheck = (List<Book>) argument;
                assertThat(bookToCheck.get(0), sameAsBean(expectedBook));
                return true;
            }
        }));

Дополнительная информация: ArgumentMatcher

0 голосов
/ 18 февраля 2019

Вы можете использовать что-то вроде Lombok https://projectlombok.org/ для подобных объектов.Как равно, hashCode, геттеры и сеттеры.

...