1

我(一段时间没有接触 JPA)开始了一个使用 Hibernate 4.1、JPA2 和 Spring 的项目。这是一个具有共同生命周期的 Maven 项目。

运行 mvn test 后,我​​得到了未找到所需数据库对象的预期结果(连接按预期成功)。然而,我所有的研究和实验都证明不足以做出似乎很普遍的事情。

  • 我希望能够在执行单元测试时让 Maven 删除/创建本地开发数据库的模式;我想 hibernate3-maven-plugin (理想情况下是 3.0 版)应该处理这个问题,但我没有设法让它工作。我不希望自动插入任何数据(为此我可以使用 DBUnit,甚至更好地让每个测试生成自己的测试数据,但这在这里不起作用)但我确实希望在测试数据库上刷新模式,反映了我带注释的模型类的当前状态。我想这将绑定到 process-test-resources 阶段。

  • 我希望使用(当前)模式定义生成一个(或一组)sql文件,但我得到的最佳结果反映了这里描述的问题:Maven + Spring + Hibernate:hibernate3-maven-plugin hbm2ddl failed for reason "Caused by :java.lang.NullPointerException”(目前没有解决方案)。

我是否错过了一些愚蠢的事情,或者此时真的不可能?如果有人可以为我提供任何

  • 关于如何实现这一点的适当文件

  • 使用休眠 4 的工作示例

  • 通过其他策略实现我的目标的任何实用方法指南。

如果它有任何相关性,数据库是 Postgres 9.1。

提前致谢。

4

2 回答 2

2

一种方法是使用Arquillian。您可以为每个测试或一组测试创建一个单独的部署包,并使用它自己的persistence.xml数据源。使用 中的hbm2dll设置persistence.xml来创建-删除或更新架构:

<property name="hibernate.hbm2ddl.auto" value="create-drop" />

如果你想预填充数据库,你可以添加一个import.sql到你的部署中,它会在应用程序启动时由 hibernate 执行,或者使用Arquillian Persistence 扩展

这是一个完整的 arquillian 测试设置作为示例:

@RunWith(Arquillian.class)
public class MyTest {

    @Deployment
    public static Archive<?> createTestArchive() {

        return ShrinkWrap.create(WebArchive.class, "myTest.war")
                .addPackages(true, "com.example")
                .addAsResource("testSeeds/seed.sql", "import.sql")
                .addAsResource("in-mem-persistence.xml", "META-INF/persistence.xml")
                .addAsWebInfResource("in-mem-datasource.xml");
    }

一个缺点是容器内测试会比简单的单元测试慢。

我不确定 Arquillian 与 Spring 的配合如何,我只将它用于 Java EE 应用程序,所以请告诉它是否有帮助。

于 2013-02-15T08:48:04.820 回答
0

再次回答我自己的问题。

为了达到我想要的结果,我必须在 maven 中将 hibernate3-maven-plugin 的 hbm2ddl 在 process-classes 阶段的执行与另一个 sql-maven-plugin 在 process-test-resources 阶段的执行联系起来。第一个为 Hibernate 的模型生成 sql,第二个将其应用于数据库。

事后看来,这似乎是一个体面和干净的解决方案。

我仍然有兴趣了解最佳实践(如果它们与我的解决方案不同),以实现设置数据库以使用 Hibernate 模型中的 maven 进行测试的目标。

于 2013-03-10T21:27:01.797 回答