2016-09-30 44 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()); 
    } 
} 
相關問題