我有几个关于使用 JUnit 集成测试 EJB 3.0 组件的问题。
在您的 JUnit 测试中,您可以向会话 bean 注入资源本地实体管理器,从而“模拟”ejb-container。但如果...
如果您需要测试您的 ejb 方法上的事务属性是否被正确处理,该怎么办?这可以在容器外完成吗?如果没有,在容器内测试它的最简单方法是什么?
如果您需要在每次测试之前确保 db 中有一些测试记录怎么办?您如何确保在测试执行后(即使它失败)db 已清除测试数据?
我有几个关于使用 JUnit 集成测试 EJB 3.0 组件的问题。
在您的 JUnit 测试中,您可以向会话 bean 注入资源本地实体管理器,从而“模拟”ejb-container。但如果...
如果您需要测试您的 ejb 方法上的事务属性是否被正确处理,该怎么办?这可以在容器外完成吗?如果没有,在容器内测试它的最简单方法是什么?
如果您需要在每次测试之前确保 db 中有一些测试记录怎么办?您如何确保在测试执行后(即使它失败)db 已清除测试数据?
您还可以使用可嵌入的 JBoss 对 EJB 进行单元测试,如#553031中所述
它不是一个很好的解决方案,但它有效。
如果您碰巧在使用 Maven,或者即使您不是,这可能会有所帮助。测试事务语义的典型方法是使用内存数据库,如 H2 或 HSQLDB (Hypersonic)。因此,实际上,您是在一个非常轻量级的容器中进行测试。Hibernate 可以配置为您的 JPA 实现。它将数据持久化到完全在 RAM 中运行的功能齐全的关系数据库中。
至于固定装置,有很多选择,其中一个比较流行的是DbUnit,但根据我的经验,它们比它们的价值要复杂得多。我更喜欢创建自己的“构建器”类,用必要的模型对象设置我的测试。我喜欢配置“setters”返回构建器的一个实例,这样我就可以像这样将调用链接在一起:
this.emf = Persistence.createEntityManagerFactory ("hibernate-hsqldb");
Widget widget = new WidgetBuilder(this.emf).setAnOption(4).setAnother("test").build();
通常,emf
将在 setUp 方法中创建并在 tearDown 中关闭。这会在测试运行之间完全初始化数据库。