【问题标题】:Integration Tests with EJB, JPA and DBUnit使用 EJB、JPA 和 DBUnit 进行集成测试
【发布时间】:2014-12-16 22:32:25
【问题描述】:

我想为执行一些基本 CRUD 操作的 ejb 编写集成测试。
这是我的测试现在的样子:

@Test
public void testAdd() {
    EJBContainer container = javax.ejb.embeddable.EJBContainer.createEJBContainer();
    MyEJBLocal myEjb= (MyEJBLocal)container.getContext().lookup("java:global/classes/MyEJB");

    // assuming I empty the database in the setup
    myEjb.add();
    int numOfEntities= myEjb.getAll().size();
    Assert.assertTrue("Unexpected number of entities", (numOfEntities==1));
    container.close();
}

显然,这不是一个很好的测试,但是如何正确集成DBUnit或任何类似的框架来控制add()方法之前和之后的数据库状态?

我正在使用 EJB、Hibernate 和嵌入式 Glassfish

【问题讨论】:

    标签: java hibernate jakarta-ee jpa dbunit


    【解决方案1】:

    您需要use Arquillian 才能正确测试您的 EJB。 Arquillian 允许您运行集成测试,以补充常规的模拟服务单元测试。

    我建议您拥有两个独立的个人资料:

    • 用于使用内存数据库(HSQLDB、H2)快速运行并验证 JPQL/Criteria 查询

    • 另一个连接到您在生产环境中使用的数据库服务器克隆。

      第二种方法对于测试您可能使用的数据库特定功能(窗口函数、公用表表达式、本机查询)以及事务逻辑(死锁、乐观锁定失败)很有用

    【讨论】:

    • 谢谢,这个博客非常有用,但我仍然想知道是否可以在不使用 Arquillian 的情况下集成 DBUnit(使用数据集)?
    • @AhmadAbdelghany 是的这是可能的。但这将是关于单元测试而不是集成测试。您可以使用spring-dbunit,它为您提供了一个方便的@DataSet 注释,或者您可以编写自己的注释来做同样的事情。 但就个人而言:我发现编写和维护许多 DbUnit xml 数据集既费时又容易出错 - 所以我改用 DbSetup
    【解决方案2】:

    我建议您不要使用嵌入式 Glassfish。为什么?因为this

    正如@VladMihalcea 所说:Arquillian 可能是您的最佳选择。要控制数据库状态,您基本上至少有两种选择:

    我个人推荐 DbSetup 用于数据库填充,FestHamcrest 用于 BDD 风格的断言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      相关资源
      最近更新 更多