集成测试与EJB,JPA和DBUnit

时间:2014-12-16 22:32:26

标签: java hibernate java-ee jpa dbunit

我想为执行一些基本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

2 个答案:

答案 0 :(得分:3)

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

我建议你有两个独立的档案:

  • 一个使用内存数据库(HSQLDB,H2)快速运行并验证JPQL / Criteria查询
  • 另一个连接到您在生产环境中使用的数据库服务器克隆。

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

答案 1 :(得分:1)

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

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

就我个人而言,我建议DbSetup用于数据库填充,FestHamcrest用于BDD样式的断言。