2017-05-20 26 views
0

我正在使用Play Framework 2.3實現的Rest API。我有一些使用Akka actor來產生結果的端點,並且由於這個錯誤,我可以單元測試它們。另一端點測試罰款。要運行一個測試,我做使用fakeApplication對象的,是這樣的:java.lang.IllegalStateException:關閉後無法獲取ClosableLazy值

 @BeforeClass 
     public static void initResources(){ 
      Helpers.start(getFakeApplicationInstance()); 
     } 

     @AfterClass 
     public static void cleanupResources(){ 

      Helpers.stop(getFakeApplicationInstance()); 
     } 

     public static FakeApplication getFakeApplicationInstance() { 
      if(fakeApp == null) 
       fakeApp = Helpers.fakeApplication(TestUtil.testSettings(), new GlobalCommon()); 

      return fakeApp; 
     } 
@Test 
    public void test() { 
     running(testServer(3333, getFakeApplicationInstance()),() -> { 
     // test go here 

})); 
} 

我不知道怎麼做的fakeApplication的工作原理與akkaSystem,但它好像有一些人失蹤。以下是堆棧跟蹤:

Test rest.RestItemTest.marshalRoomDetails failed: java.lang.IllegalStateException: Can't get ClosableLazy value after it has been closed, took 7.732 sec 
[error]  at play.core.ClosableLazy.get(ClosableLazy.scala:49) 
[error]  at play.api.libs.concurrent.AkkaPlugin.applicationSystem(Akka.scala:71) 
[error]  at play.api.libs.concurrent.Akka$$anonfun$system$1.apply(Akka.scala:29) 
[error]  at play.api.libs.concurrent.Akka$$anonfun$system$1.apply(Akka.scala:29) 
[error]  at scala.Option.map(Option.scala:146) 
[error]  at play.api.libs.concurrent.Akka$.system(Akka.scala:29) 
[error]  at play.api.libs.concurrent.Akka.system(Akka.scala) 
[error]  at play.libs.Akka.system(Akka.java:25) 
[error]  at utils.GlobalCommonTest.onStart(GlobalCommonTest.java:186) 
[error]  at utils.APIGlobalTest.onStart(APIGlobalTest.java:16) 
[error]  at play.core.j.JavaGlobalSettingsAdapter.onStart(JavaGlobalSettingsAdapter.scala:22) 
[error]  at play.api.GlobalPlugin.onStart(GlobalSettings.scala:220) 
[error]  at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91) 
[error]  at play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91) 
[error]  at scala.collection.immutable.List.foreach(List.scala:381) 
[error]  at play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:91) 
[error]  at play.api.Play$$anonfun$start$1.apply(Play.scala:91) 
[error]  at play.api.Play$$anonfun$start$1.apply(Play.scala:91) 
[error]  at play.utils.Threads$.withContextClassLoader(Threads.scala:21) 
[error]  at play.api.Play$.start(Play.scala:90) 
[error]  at play.api.Play.start(Play.scala) 
[error]  at play.test.Helpers.start(Helpers.java:470) 
[error]  at play.test.Helpers.running(Helpers.java:486) 

我只在使用Actors調用端點時纔會這樣做。任何幫助或經驗分享,將不勝感激。

回答

0

這主要是由於在多個測試中重複使用了相同的應用程序實例。在一個測試中使用應用程序上下文時,它會啓動插件並啓動上下文。在測試結束時,應用程序關閉,並關閉插件。如果您嘗試重新啓動相同的應用程序實例,則插件不會重新啓動,因爲它們是隻能關閉一次的ClosableLazy對象。解決方案是不使用singelton模式,併爲每個單獨的測試創建一個新的應用程序實例。所以這一翻譯:

public static FakeApplication getFakeApplicationInstance() { 
      if(fakeApp == null) 
       fakeApp = Helpers.fakeApplication(TestUtil.testSettings(), new GlobalCommon()); 

      return fakeApp; 
     } 

的解決方案是:

public static FakeApplication getFakeApplicationInstance() { 
      return Helpers.fakeApplication(TestUtil.testSettings(), new GlobalCommon()); 
     } 

我希望這會幫助別人。

相關問題