Play-Module 内部的单元测试(JPA,eclipse PersistenceProvider)

Posted

技术标签:

【中文标题】Play-Module 内部的单元测试(JPA,eclipse PersistenceProvider)【英文标题】:Unit Testing from within 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 【参考方案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。

以上是关于Play-Module 内部的单元测试(JPA,eclipse PersistenceProvider)的主要内容,如果未能解决你的问题,请参考以下文章

JPA - 如何在单元测试之间截断表

使用 JPA2 时如何对 EJB 进行单元测试?

使用 JPA2 时如何对 EJB 进行单元测试?

对 Spring Data JPA @Query 进行单元测试是不可能的,真的吗?

Spring Boot中JPA Repository的Save方法的单元测试

Spring JPA Junit 关闭自动回滚