[英]How to compare class annotated by @Entity field by field without degrading performance of storing object into db?
我有在Java
中用@Entity
注釋的DB類。
我想比較Hamcrest
字段比較字段的2個類實例,但從Hamcrest
收到對象不相等的錯誤。 除非我在Eclipse
自動生成equals
和hashCode
,否則它將持續存在。
實體的結構如下:
@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;
}
為了簡單起見,我省略了所有的getter和setter方法。
我上面如何使用實體的示例代碼:
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
字段而不是所有字段檢查的。
您可以使用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
您可能想要對類似這樣的數據實體使用Lombok https://projectlombok.org/之類的東西。 像equals,hashCode,getter和setter一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.