Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Akka测试套件“;“未来.已完成”;检查_Java_Testing_Akka - Fatal编程技术网

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应用于集成测试
当声明TestActorRef时,actor的运行线程将是同步运行的单个线程,并在与测试/控制台运行相同的线程上同步处理整个ActorSystem

引用你提到的两个重要段落:

发送给参与者的消息将在当前线程上同步处理,并且答案可能会像往常一样发回

TestActorRef覆盖两个字段:它将调度程序设置为CallingReadDispatcher.global,并将receiveTimeout设置为None

我找到了你新问题的答案

在检查
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()));