2013-01-07 45 views
0

我想知道是否有人使用Hibernate作爲持久性引擎使用Play 2.0進行自動化測試?在測試框架中使用Hibernate的Java Play Framework 2.0

我試圖下面的測試,但我得到這個errror:

[error] Test tests.TestApp.findById failed: No EntityManager bound to this threa 
d. Try to annotate your action method with @play.db.jpa.Transactional 
[error]  at play.db.jpa.JPA.em(JPA.java:45) 
[error]  at models.User.findById(User.java:72) 
[error]  at tests.TestApp$1.run(TestApp.java:55) 
[error]  at play.test.Helpers.running(Helpers.java:277) 
[error]  at tests.TestApp.findById(TestApp.java:51) 

測試代碼是:

@Test 
public void findById() 
{ 
    running(fakeApplication(), new Runnable() 
    { 
     public void run() 
     { 
      User user = User.findById(21l); 
      assertThat(user.getName()).isEqualTo("Dave"); 
     } 
    }); 
} 

我嘗試添加了@Transactional anotation的測試方法,但是這沒有效果。

然後我嘗試添加綁定到當前JPA線程的setup和teardown方法,但是沒有這方面的運氣。雖然我不確定我是否正確地做了這件事。

private EntityManager em; 


@Transactional 
@Before 
public void setUp() 
{ 
    em = JPA.em("org.hibernate.ejb.HibernatePersistence"); 
    JPA.bindForCurrentThread(em); 
} 

@After 
public void tearDown() 
{ 
    JPA.bindForCurrentThread(null); 
    em.close(); 
} 

這提供了以下錯誤:

[error] Test tests.TestApp.findById failed: There is no started application 
[error]  at scala.sys.package$.error(package.scala:27) 
[error]  at play.api.Play$$anonfun$current$1.apply(Play.scala:44) 
[error]  at play.api.Play$$anonfun$current$1.apply(Play.scala:44) 
[error]  at scala.Option.getOrElse(Option.scala:108) 
[error]  at play.api.Play$.current(Play.scala:44) 
[error]  at play.api.Play.current(Play.scala) 
[error]  at play.Play.application(Play.java:12) 
[error]  at play.db.jpa.JPA.em(JPA.java:21) 
[error]  at tests.TestApp.setUp(TestApp.java:26) 
[error]  ... 

如果任何人都可以提供任何幫助,我將不勝感激!

回答

0

嘗試此圖案:

running(fakeApplication(), new Runnable() 
{ 
    public void run() 
    { 
    JPA.withTransaction(new play.libs.F.Callback0() 
    { 
     public void invoke() throws DataAccessException 
     { 
     ... 
     } 
    }); 
    } 
}); 

Here的另一個例子示出在安裝和拆卸方法的邏輯,你試圖與bindForCurrentThread,在一個抽象基類。

相關問題