2017-05-20 25 views
0

私はPlay Framework 2.3を使用して実装されたRest APIを使用しています。私は結果を生成するためにAkkaの俳優を使用するいくつかのエンドポイントを持っています、そして、私はこのエラーのために残念なことにそれらをユニットテストすることができました。他のエンドポイントは正常にテストされます。テストを実行するには、私は、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) 

私は俳優を利用するエンドポイントを呼び出すときにしか得られません。どんな助けや経験の共有も大歓迎です。

答えて

0

これは主に複数のテストで同じアプリケーションインスタンスを再利用したためです。 1つのテストでアプリケーションコンテキストが使用されると、プラグインが起動され、コンテキストが開始されます。テストの最後に、アプリケーションがシャットダウンされ、プラグインもシャットダウンされます。この同じアプリケーションインスタンスを再起動しようとすると、一度しか閉じられないClosableLazyオブジェクトであるため、プラグインは再起動されません。解決策はシングルトンパターンを使用せず、単一のテストごとに新しいアプリケーションインスタンスを作成することでした。だから、のintead:

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()); 
     } 

私はこれが誰かを助けることを願っています。

関連する問題