【问题标题】:How to test a function with EntityManager in play framework 2.5如何在 play framework 2.5 中使用 EntityManager 测试功能
【发布时间】:2016-09-30 07:33:51
【问题描述】:
我想测试“服务”级别或“道”级别的代码。
但我无法解决异常
"没有 EntityManager 绑定到这个线程。尝试将这个调用包装在
JPAApi.withTransaction,或确保已设置 HTTP 上下文
这个话题。”
这是我的 junit 测试代码。
导致异常的代码是 userService.createUser(); 在函数“createUser”
@Inject
Application application;
@Before
public void setup() {
Module testModule = new AbstractModule() {
@Override
public void configure() {
}
};
GuiceApplicationBuilder builder = new GuiceApplicationLoader()
.builder(new ApplicationLoader.Context(Environment.simple()))
.overrides(testModule);
Guice.createInjector(builder.applicationModule()).injectMembers(this);
Helpers.start(application);
}
@After
public void teardown() {
Helpers.stop(application);
}
@Test
@Transactional
public void createUser() {
running(application, () -> {
UserService userService = application.injector().instanceOf(UserService.class);
userService.createUser();
});
}
请帮我解决异常
谢谢~
【问题讨论】:
标签:
java
jpa
junit
playframework
【解决方案1】:
作为一个想法,您可以添加另一个注入字段:
@Inject play.db.jpa.JPAApi japApi
然后在你的测试中你可以调用jpaApi.withTransaction(anotherRunnableBlock);
【解决方案2】:
对于 JungGyu Kim 来说可能为时已晚,但对于其他在谷歌上搜索此问题的人来说。
我找到了适用于 2.6.x 版本的解决方案,但也适用于 2.5.x。
package models;
import org.junit.Before;
import org.junit.Test;
import play.Application;
import play.db.jpa.JPAApi;
import play.test.Helpers;
import play.test.WithApplication;
import java.util.stream.Stream;
import static org.junit.Assert.assertTrue;
public class MyRepositoryTest extends WithApplication {
@Override
public Application provideApplication() {
return Helpers.fakeApplication(Helpers.inMemoryDatabase());
}
JPAApi jpaApi;
MyRepository myRepository;
@Before
public void init() {
// must get instances like this, as application is created for each test
jpaApi = app.injector().instanceOf(JPAApi.class);
userRepository = app.injector().instanceOf(UserRepository.class);
// no need to setup / clear DB, WithApplication create new DB for each test
}
@Test
public void testGetAllEntries() {
// insert some data first
performNativeQuery("INSERT INTO ...");
// call tested method
final Stream<Entity> result = myRepository.getAllEntries();
// perform some assertions
assertTrue(result.count() == 1);
}
private void performNativeQuery(final String query) {
jpaApi.withTransaction(em -> em.createNativeQuery(query).executeUpdate());
}
}