Testing 从Play模块内部进行单元测试(JPA、eclipse PersistenceProvider)

Testing 从Play模块内部进行单元测试(JPA、eclipse PersistenceProvider),testing,jpa,junit,playframework,persistence.xml,Testing,Jpa,Junit,Playframework,Persistence.xml,我的应用程序基于playframework,包含多个模块。 数据库交互通过JPA(org.eclipse.persistence.JPA.PersistenceProvider)处理 我的任务是用单元测试覆盖其中一个模块 不幸的是,在模块级提供单元测试的情况下运行“play test”命令会导致以下异常: javax.persistence.PersistenceException: No Persistence provider for EntityManager named defaultP

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

我的任务是用单元测试覆盖其中一个模块

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

javax.persistence.PersistenceException: No Persistence provider for EntityManager named defaultPersistenceUnit
持久性提供程序是在conf/META-INF/Persistence.xml中全局(模块外部)定义的 将global persistence.xml复制到模块并不能解决此问题

假定模块内没有其他测试,则将测试放在模块外部(在全局测试目录中)并执行它们是完美的

有人能解释一下为什么会出现错误吗?有没有办法在模块级进行JPA测试?

提前谢谢


Urs

我检查了你的代码。我认为不需要另一个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();
       }
     });
    }
  });
}
或:

这些代码来自。我不测试它

请将您的代码修改为:

@BeforeClass
public static void setUp() {
    FakeApplication app = fakeApplication(inMemoryDatabase());
    start(app);

    em = app.getWrappedApplication().plugin(JPAPlugin.class).get().em("default");
    JPA.bindForCurrentThread(em);
}

请试一试

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

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

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

我认为您会遇到异常,因为它没有指定任何persistenceUnit。对于JUnit项目,需要调整另一个persistence.xml。全局persistence.xml是否使用JTA?你能为我们描述一下你的项目结构吗?项目结构如下:。JPA在global persistence.xml中定义。如何为单元测试指定另一个persistence.xml?谢谢您的结构。我认为global persistence.xml使用JTA。请确认!如果目标是在模块中测试,则需要使用相同的持久性上下文。也许这是可能的。但在运行这些测试之前,我不知道运行这些测试的是什么,也不知道您的应用程序正在运行什么。我的问题是如何在JUnit测试中声明EntityManger(或播放famework的特性)?可以分享一个例子吗?嗨,herry,谢谢你在这里回复我的问题。不确定是否使用了JTA。测试结果如下:,你好,亨利。谢谢你抽出时间。不幸的是,上述样品不起作用。都试过了。仍然被同样的坚持所困扰,这是个坏消息!什么是inMemoryDatabase()方法?是初始化还是添加数据库连接?是否可以尝试忽略此参数并尝试运行应用程序?这只是小费。可能您有一个简单的问题:在您的应用程序中,对持久性单元的调整是错误的。请查收。
@BeforeClass
public static void setUp() {
    FakeApplication app = fakeApplication(inMemoryDatabase());
    start(app);

    em = app.getWrappedApplication().plugin(JPAPlugin.class).get().em("default");
    JPA.bindForCurrentThread(em);
}