2016-09-30 45 views
0

我想测试“服务”级别或“道”级别的代码。如何在播放框架2.5中使用EntityManager测试功能

,但我无法解析异常

“没有的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(); 
    }); 

} 

请帮我解决异常

THX〜

+0

你解决了吗? –

回答

0

这样一想,你可能会添加其他注射领域:

@Inject play.db.jpa.JPAApi japApi 

然后在您的测试中,您可以拨打jpaApi.withTransaction(anotherRunnableBlock);

0

对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()); 
    } 
} 
相关问题