【问题标题】:Unit Testing from within Play-Module (JPA, eclipse PersistenceProvider)Play-Module 内部的单元测试(JPA,eclipse PersistenceProvider)
【发布时间】:2013-11-11 10:24:23
【问题描述】:

我的应用程序基于 playframework 并包含多个模块。 数据库交互通过 JPA 处理 (<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>)

我的任务是用单元测试覆盖这些模块之一。

不幸的是,在模块级提供单元测试的情况下运行“play test”命令会导致以下异常:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named defaultPersistenceUnit

Persistence-Provider 在 conf/META-INF/persistence.xml 中全局定义(在模块之外) 将全局 persistence.xml 复制到模块并不能解决问题。

假设模块内没有其他测试,将测试放在模块之外(在全局测试目录中)并执行它们可以完美地工作。

谁能解释一下为什么会出现错误?有什么方法可以在模块级别进行支持 JPA 的测试?

提前致谢

你的

【问题讨论】:

  • 我认为你得到的那个异常是因为它没有指定任何persistenceUnit。对于JUnit 项目需要调整另一个persistence.xml。全局 persisitence.xml 是使用 JTA 吗?您能向我们描述一下您的项目结构吗?
  • 项目结构看起来像这样:Structure。 JPA 在全局 persitence.xml 中定义。如何为单元测试指定另一个 persistence.xml?
  • 感谢您的结构。我认为全局persistence.xml 使用JTA。请确认!如果目标是在模块中进行测试,则需要使用相同的持久性上下文。也许这是可能的。但是在运行这些测试之前,我不知道运行这些测试和您的应用程序正在运行什么。我的问题是如何在您的 JUnit 测试中声明 EntityManger(或玩名作的功能)?可以分享一个例子吗?
  • 嗨,herry,感谢您的回复,这是我的persistence.xml。不确定是否使用了 JTA。测试看起来像这样:Abstract.java, NavigationTest.java

标签: testing jpa junit playframework persistence.xml


【解决方案1】:

我在 Eclipse 中从我的 play 应用程序运行 JUnit 测试时遇到了同样的问题。

要解决此问题,您需要使文件夹 conf 可用于所有项目。

项目属性-> Java 构建路径->源 添加文件夹并选择 conf 文件夹。

【讨论】:

    【解决方案2】:

    我检查了你的代码。我认为不需要另一个persistence.xml。您可以在播放模块中尝试这些解决方案吗:

    @Test()
    public void empty() {
        running(fakeApplication(), new Runnable() {
         public void run() {
           JPA.withTransaction(new play.libs.F.Callback0() {
            public void invoke() {
             Object o = new Object(someAttrib);
             o.save();
             assertThat(o).isNotNull();
           }
         });
        }
      });
    }
    

    或者:

     @Before
        public void setUpIntegrationTest() {
            FakeApplication app = fakeApplication();
            start(app);
            em = app.getWrappedApplication().plugin(JPAPlugin.class).get().em("default");
            JPA.bindForCurrentThread(em);
        }
    

    这些代码来自this page。我不测试!

    请将您的代码修改为:

    @BeforeClass
    public static void setUp() {
        FakeApplication app = fakeApplication(inMemoryDatabase());
        start(app);
    
        em = app.getWrappedApplication().plugin(JPAPlugin.class).get().em("default");
        JPA.bindForCurrentThread(em);
    }
    

    请试一试!

    【讨论】:

    • 嗨,赫瑞。谢谢你的时间。不幸的是,上面的示例不起作用。都试过了。仍然遇到相同的 PersistenceException
    • 这是个坏消息!什么是 inMemoryDatabase() 方法?是初始化还是添加数据库连接?您可以尝试省略此参数并尝试运行应用程序吗?这只是小费。可能是您有一个简单的问题:您的应用程序中的持久性单元调整错误。请查看these adjustment。
    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2015-03-24
    • 2019-11-24
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多