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
注释。我想当我把它们移走的时候什么也不会发生。如果你根据你最后的评论更新你的答案,我会接受,这样你可以得到一些分数。