Java Akka测试套件“;“未来.已完成”;检查
在本例中:Java Akka测试套件“;“未来.已完成”;检查,java,testing,akka,Java,Testing,Akka,在本例中: 现在的问题是:如果我不想回去/告诉别人什么,我该怎么办?有点“好的”。没有例外,那就没问题了?或者???它断言future.isComplete()返回了一个“true”。如果返回“false”,则If将失败。我一开始认为代码是错误的。通常,一个未来是在另一个线程上计算的,当另一个线程完成计算结果时,completed。因此,不等待未来完成就断言未来是在未来启动之后完成的,这看起来是非常错误的 但是他们在您链接到的文档中解释说,当使用TestActorRef时,未来是在同一个线程上
现在的问题是:如果我不想回去/告诉别人什么,我该怎么办?有点“好的”。没有例外,那就没问题了?或者???它断言future.isComplete()返回了一个“true”。如果返回“false”,则If将失败。我一开始认为代码是错误的。通常,一个未来是在另一个线程上计算的,当另一个线程完成计算结果时,
completed
。因此,不等待未来完成就断言未来是在未来启动之后完成的,这看起来是非常错误的
但是他们在您链接到的文档中解释说,当使用TestActorRef
时,未来是在同一个线程上计算的。因此,当调用Pattern.ask()
时,将计算未来,并且只有在为该计算运行了所有操作之后,才会转到下一行assert(future.isCompleted)
。使用TestActorRef
时是正确的,但在实际程序中则不正确
它们删除了用于测试的并发/多线程,因为由于多线程代码的非确定性,几乎不可能对其进行测试。使用TestActorRef测试Akka参与者与使用ActorRef完全不同:
- TestActorRef应用于同步测试
- ActorRef应用于集成测试
future.isCompleted()之前,您应该等待一段时间
我的代码现在看起来像这样(注意第四行):
final-Props-Props=Props.create(MyActor.class);
最终TestActorRef=TestActorRef.create(系统、道具,“testB”);
最终未来=akka.pattern.Patterns.ask(参考“say42”,3000);
ready(future,scala.concurrent.duration.duration.Inf());
//下面的断言现在应该为true
assertTrue(future.isCompleted());
assertEquals(42,wait.result(future,Duration.Zero());
不回去/不说任何事是可以的。ActorModel建议您,如果actors工作中存在任何错误或问题,则应“告诉”用户错误消息。
如果你不回来/不告诉任何事情,你就不能使用“已完成的未来”。考虑使用一个主管演员来处理演员的测试结果。如果你不想发送任何东西,请不要使用“?”。使用“!”。
final Props props = Props.create(MyActor.class);
final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testB");
final Future<Object> future = akka.pattern.Patterns.ask(ref, "say42", 3000);
assertTrue(future.isCompleted());
assertEquals(42, Await.result(future, Duration.Zero()));
if( message instanceof PutConfigurationMessage) {
PutConfigurationMessage putConfigurationMessage = (PutConfigurationMessage) message;
initSomeConfigurations(putConfigurationMessage.getConfigurations());
// here might be this line: `getSender().tell(resultMessage, getSelf());`
}
final Props props = Props.create(MyActor.class);
final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testB");
final Future<Object> future = akka.pattern.Patterns.ask(ref, "say42", 3000);
Await.ready(future, scala.concurrent.duration.Duration.Inf());
// Following assert should be true by now
assertTrue(future.isCompleted());
assertEquals(42, Await.result(future, Duration.Zero()));