【问题标题】: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());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多