【问题标题】:Spring, JPA -- integration test of CRUD of entity which has many transitive dependencies of other entitiesSpring, JPA -- 实体的 CRUD 集成测试,该实体具有许多其他实体的传递依赖项
【发布时间】:2012-04-17 10:54:28
【问题描述】:

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

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

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

感谢您的回复。


更新——示例

让我们假设以下实体结构

此结构由 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注释,所以值不能是@987654332 @。所以我也需要保留这些实体,但它们也有依赖关系。

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

【问题讨论】:

    标签: spring testing jpa mocking integration


    【解决方案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
        }
    
    }
    

    更新

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

    【讨论】:

    • 你可能误解了我的意思。我知道如何在 Spring 上下文中进行测试。我只是不想手动创建 Product 实体所依赖的实体并将它们持久化。因为这些实体也可能依赖于其他实体,所以我最终会保留许多实体,只是为了测试检索到 Product 的查询。
    • 如果您不想创建和保留这些实体,请不要创建它们或使用现有的实体。举个具体的例子
    • 那是我不明白的,为什么 category 和 something 不能为空?
    • 你是对的,它可以是null。我在那些@ManyToOne 上也有@NotNull 注释。我想当我删除它们时什么都不会发生。如果您根据上一条评论更新您的答案,我会接受它,这样您就可以获得一些积分。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 2013-08-18
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      相关资源
      最近更新 更多