java.lang.IllegalStateException:关闭后无法获取ClosableLazy值

java.lang.IllegalStateException:关闭后无法获取ClosableLazy值,java,unit-testing,junit,playframework-2.0,akka,Java,Unit Testing,Junit,Playframework 2.0,Akka,我正在开发一个使用PlayFramework 2.3实现的RESTAPI。我有一些端点使用Akka参与者来产生结果,不幸的是,由于这个错误,我可以对它们进行单元测试。其他端点测试结果良好。为了运行测试,我使用了一个fakeApplication对象,类似于: @BeforeClass public static void initResources(){ Helpers.start(getFakeApplicationInstance());

我正在开发一个使用PlayFramework 2.3实现的RESTAPI。我有一些端点使用Akka参与者来产生结果,不幸的是,由于这个错误,我可以对它们进行单元测试。其他端点测试结果良好。为了运行测试,我使用了一个fakeApplication对象,类似于:

       @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)

我只有在调用使用参与者的端点时才会得到这个结果。如有任何帮助或经验分享,将不胜感激

这主要是由于在多个测试中重用了相同的应用程序实例。在一个测试中使用应用程序上下文时,它会启动插件并启动上下文。在测试结束时,应用程序被关闭,这也会关闭插件。如果您尝试重新启动同一个应用程序实例,则插件不会重新启动,因为它们是可关闭的对象,只能关闭一次。解决方案是不使用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());
        }
我希望这能帮助别人