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)的主要内容,如果未能解决你的问题,请参考以下文章
对 Spring Data JPA @Query 进行单元测试是不可能的,真的吗?