2016-09-16 11 views
0

MVC Webアプリケーションの通常のテストをいくつか書き、findById()テストで停止しました。 私のモデルクラス:hibernateエンティティに正しくどのように注釈を付けるか

@Entity 
public class Product { 
    @Id 
    @GeneratedValue (strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String name; 

    private String description; 

    private double purchasePrice; 

    private double retailPrice; 

    private double quantity; 

    @ManyToOne 
    @JoinColumn (name = "supplier_id") 
    private Supplier supplier; 

    @ManyToOne 
    @JoinColumn (name = "category_id") 
    private Category category; 

@Entity 
public class Category { 
    @Id 
    @GeneratedValue (strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String name; 

    private String description; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany 
    @Cascade(org.hibernate.annotations.CascadeType.ALL) 
    private List<Product> products; 

@Entity 
public class Supplier { 
    @Id 
    @GeneratedValue (strategy = GenerationType.IDENTITY) 
    private Long id; 

    private String name; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @Cascade(org.hibernate.annotations.CascadeType.ALL) 
    @OneToOne 
    private Contact contact; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @OneToMany 
    private List<Product> products; 

そして、私のテストコード:

private Product productTest; 
private Category categoryTest; 
private Supplier supplierTest; 

@Before 
public void setUp() throws Exception { 
    categoryTest = new Category("Test category", "", null); 
    supplierTest = new Supplier("Test supplier", null, null); 
    productTest = new Product("Test product","", 10, 20, 5, supplierTest, categoryTest); 

    categoryService.save(categoryTest); 
    supplierService.save(supplierTest); 
    productService.save(productTest); 
} 

@Test 
public void findById() throws Exception { 
    Product retrieved = productService.findById(productTest.getId()); 
    assertEquals(productTest, retrieved); 
} 

あなたが見ることができるだけでなく、アサーションは、理由差product.category.productsとproduct.supplier.productsの特性のために、失敗しました写真: enter image description here 1つの製品にはnullがあり、もう1つは{PersistentBag}です。 確かに私は、これらのプロパティを無視するカスタムequalsメソッドを書いて簡単にハックすることができますが、それが最良の方法ではないことは確かです。

なぜ、これらのフィールドが異なるのですか? エンティティフィールドの注釈が正しく解決されていることを確信しています。

答えて

1

二つのポインタ:entitesが外に作成され、あなたのユニットテストのあなたのフィクスチャで作成している間、あなたのエンティティを取得するときに、注釈付きのフィールドは動的にあなたのORMによってロードされているので、あなたは、あなたの関係の分野で@LazyCollection(LazyCollectionOption.FALSE)使用

  • あなたのORMからこれらのフィールドを評価しないでください。
  • @LazyCollection(LazyCollectionOption.FALSE)を削除しても、取り出されたエンティティと手で作成されたエンティティでassertEquals()を実行する場合は、他の違いがあります。例えば、Hibernateでは、怠けたListnullではなく、PersistentListのインスタンスになります。

したがって、アサーションを実行するためにいくつかの作業を実行する必要があります。
プロパティを個別にチェックしたり、Reflectionを使用してフィールドをアサートしたり、期待されるオブジェクトのnullフィールドの比較を無視することができます。

チェックhttp://www.unitils.org/tutorial-reflectionassert.html、お手伝いがあります。

関連する問題