java.lang.IllegalStateException: 关闭后无法获取 ClosableLazy 值
java.lang.IllegalStateException: Can't get ClosableLazy value after it has been closed
我正在研究使用 Play Framework 2.3 实现的 Rest API。我有一些端点使用 Akka actors 来产生结果,不幸的是,由于这个错误,我可以对它们进行单元测试。其他端点测试正常。为了 运行 测试,我使用了一个 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.apply(Akka.scala:29)
[error] at play.api.libs.concurrent.Akka$$anonfun$system.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$$anonfun$apply$mcV$sp.apply(Play.scala:91)
[error] at play.api.Play$$anonfun$start$$anonfun$apply$mcV$sp.apply(Play.scala:91)
[error] at scala.collection.immutable.List.foreach(List.scala:381)
[error] at play.api.Play$$anonfun$start.apply$mcV$sp(Play.scala:91)
[error] at play.api.Play$$anonfun$start.apply(Play.scala:91)
[error] at play.api.Play$$anonfun$start.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 的端点时才会得到它。任何帮助或经验分享,将不胜感激。
这主要是由于在多个测试中重复使用了同一个应用程序实例。当在一次测试中使用应用程序上下文时,它会启动插件并启动上下文。测试结束时,应用程序关闭,插件也会关闭。如果您尝试重新启动同一个应用程序实例,那么插件不会重新启动,因为它们是只能关闭一次的 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());
}
我希望这会对某人有所帮助。
我正在研究使用 Play Framework 2.3 实现的 Rest API。我有一些端点使用 Akka actors 来产生结果,不幸的是,由于这个错误,我可以对它们进行单元测试。其他端点测试正常。为了 运行 测试,我使用了一个 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.apply(Akka.scala:29)
[error] at play.api.libs.concurrent.Akka$$anonfun$system.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$$anonfun$apply$mcV$sp.apply(Play.scala:91)
[error] at play.api.Play$$anonfun$start$$anonfun$apply$mcV$sp.apply(Play.scala:91)
[error] at scala.collection.immutable.List.foreach(List.scala:381)
[error] at play.api.Play$$anonfun$start.apply$mcV$sp(Play.scala:91)
[error] at play.api.Play$$anonfun$start.apply(Play.scala:91)
[error] at play.api.Play$$anonfun$start.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 的端点时才会得到它。任何帮助或经验分享,将不胜感激。
这主要是由于在多个测试中重复使用了同一个应用程序实例。当在一次测试中使用应用程序上下文时,它会启动插件并启动上下文。测试结束时,应用程序关闭,插件也会关闭。如果您尝试重新启动同一个应用程序实例,那么插件不会重新启动,因为它们是只能关闭一次的 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());
}
我希望这会对某人有所帮助。