2016-09-16 5 views
0

Напишите некоторые обычные тесты для моего MVC webapp и остановились при тестировании findById(). Мои классы моделей:Как правильно аннотировать объекты спящего режима

@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 свойства, как вы можете видеть на pic: enter image description here Один продукт имеет нуль, другой как {PersistentBag}. Конечно, я могу легко взломать его, написав собственный метод equals (который будет игнорировать эти свойства), но уверен, что это не лучший способ.

Итак, почему эти поля отличаются? Я уверен, что решение в правильной аннотации полей объектов.

ответ

1

два указателя:

  • вы используете в ваших полях отношений @LazyCollection(LazyCollectionOption.FALSE), поэтому поля с этой аннотацией динамически загружаются вашим ОРМ, когда вы извлекаете вашу сущность, а entites созданы в приспособлении Вашего модульного тестирования создаются за пределы от вашего ORM, и вы не оцениваете эти поля.
  • Даже если вы удалите @LazyCollection(LazyCollectionOption.FALSE), у вас могут быть другие отличия, если вы хотите сделать assertEquals() с извлеченным объектом и сущностью, созданной рукой. Например, с Hibernate, ваш ленивый List не будет null, но экземпляр PersistentList.

Итак, вы должны выполнить некоторые работы для выполнения утверждений.
Вы можете проверить свойства по отдельности или использовать Reflection для утверждения полей и игнорировать сравнение для нулевых полей в ожидаемом объекте.

проверка http://www.unitils.org/tutorial-reflectionassert.html, это может вам помочь.