Spring,JPA——实体CRUD的集成测试,该实体具有许多其他实体的可传递依赖项

Spring,JPA——实体CRUD的集成测试,该实体具有许多其他实体的可传递依赖项,spring,testing,jpa,mocking,integration,Spring,Testing,Jpa,Mocking,Integration,我有一个实体,例如,产品,它聚合了其他实体,如类别。这些实体还可以聚合其他实体,以此类推。现在我需要测试对数据库的查询 对于简单的CRUD,我将创建EntityManager的模拟。但是,如果我有更复杂的查询,我需要测试其正确的功能,该怎么办呢。然后,我可能需要持久化实体(或更多实体),并尝试检索/更新,不管怎样。我还需要持久化我的产品所依赖的所有实体 我不喜欢这种方法。测试此类查询的最佳方法是什么 谢谢你的回复 更新--示例 让我们假设以下实体结构 此结构由JPA实现维护。例如,Produ

我有一个实体,例如,
产品
,它聚合了其他实体,如
类别
。这些实体还可以聚合其他实体,以此类推。现在我需要测试对数据库的查询

对于简单的CRUD,我将创建
EntityManager
的模拟。但是,如果我有更复杂的查询,我需要测试其正确的功能,该怎么办呢。然后,我可能需要持久化实体(或更多实体),并尝试检索/更新,不管怎样。我还需要持久化我的
产品所依赖的所有实体

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

谢谢你的回复


更新--示例

让我们假设以下实体结构

此结构由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
,但它依赖于
Category
Entity1
,并且有
@manytone
注释,所以值不能
null
。所以我也需要持久化这些实体,但它们也有依赖关系


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

我不知道其他方法,但对于持久化产品及其依赖项,您可以使用帮助您设置数据库数据的测试框架。

您可以使用
@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
    }

}
更新


您不能将依赖项设置为null,以避免将它们持久化

您可能误解了我的意思。我知道如何在Spring上下文中进行测试。我只是不想手动创建
Product
实体所依赖的实体并将其持久化。因为这些实体可能还依赖于其他实体,所以我最终会持久化许多实体,只是为了测试检索
产品
的查询。如果您不想创建和持久化这些实体,请不要创建它们或使用现有的实体。举一个具体的例子,这是我不明白的,为什么类别和某些东西不能为空?你是对的,它可以是
null
。我在那些
@ManyToOne
上也有
@NotNull
注释。我想当我把它们移走的时候什么也不会发生。如果你根据你最后的评论更新你的答案,我会接受,这样你可以得到一些分数。