3

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

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

不幸的是,使用在模块级别提供的单元测试运行“播放测试”命令会导致以下异常:

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

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

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

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

提前致谢

乌尔斯

4

2 回答 2

1

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

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

Project Properties-> Java Build Path -> Source Add Folder 并选择conf文件夹。

于 2014-06-04T13:46:29.987 回答
0

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

这些代码来自这个页面。我不测试!

请将您的代码修改为:

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

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

请试一试!

于 2013-11-13T09:52:24.153 回答