Spring,JPA - 实体的CRUD集成测试,它具有许多其他实体的传递依赖性

时间:2012-04-03 18:26:34

标签: spring testing jpa mocking integration

我有实体,例如Product聚合其他实体,例如Category。这些实体也可以聚合其他实体等。现在我需要测试我对数据库的查询。

对于简单的CRUD,我会创建模拟EntityManager。但是,如果我有更复杂的查询,我需要测试正确的功能。然后我可能需要持久化实体(或更多)并尝试检索/更新,无论如何。我还需要保留Product所依赖的所有实体。

我不喜欢这样的做法。测试此类查询的最佳方法是什么?

感谢您的回复。


更新 - 示例

让我们假设以下实体结构 enter image description here

此结构由JPA实现维护。例如,Product类看起来像这样

@Entity
public class Product {

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

    private String name;

    @ManyToOne
    private Category category; 

    @ManyToOne
    private Entity1 something;    
}

现在,如果我想测试DAO中使用的任何查询,我需要在数据库中创建Product,但它依赖于CategoryEntity1并且@ManyToOne }注释,因此值不能是null。所以我也需要坚持这些实体,但它们也有依赖关系。

我正在考虑在使用SQL脚本或dbunit(由@chalimartines提到)进行测试之前预先创建CategoryEntity1Entity2等实体,这样可以节省大量代码,但我不知道这是否是一个好的解决方案。我想知道一些这种测试的最佳实践。

2 个答案:

答案 0 :(得分:1)

我不知道其他方式,但是为了保留Product及其依赖项,您可以使用可帮助您设置数据库数据的测试框架DBunit

答案 1 :(得分:1)

您可以使用@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)作为

@ContextConfiguration(locations={"classpath:/path/to/your/applicationContextTest.xml"})
@RunWith( SpringJUnit4ClassRunner.class)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class YourClassTest {

    @Test
    public void test() {
        //your crud
    }

}

<强>更新

您不能将dependecies设置为null以避免持久化