Wenn ein Actor mithilfe von TestActorRef.apply() erstellt wird, kann er möglicherweise nicht aufgelöst werden, indem actorSystem.actorSelection.resolveOne
in einem Future aufgerufen wird.Mit TestActorRef erstellte Actors können manchmal nicht aufgelöst werden.
Das doc für TestActorRef sagt, es kann in Single-Thread-Umgebung verwendet werden, aber ich frage mich, was ist der Grund für den folgenden Test fehlschlagen.
Akka Version: 2.4.16
Minimal Test, der, wenn Lauf 1000 mal mit Fehlern fehlschlägt akka.actor.ActorNotFound: Actor not found for: ActorSelection[Anchor(akka://test-system/), Path(/user/test-actor)]
:
import akka.actor.{Actor, ActorSystem, Props}
import akka.testkit.TestActorRef
import akka.util.Timeout
import org.junit.runner.RunWith
import org.scalatest._
import org.scalatest.junit.JUnitRunner
import scala.concurrent.Await
import scala.concurrent.duration._
@RunWith(classOf[JUnitRunner])
class TestActorRefTest extends FunSuite with Matchers with BeforeAndAfterAll {
implicit val actorSystem = ActorSystem("test-system")
implicit val timeout = Timeout.durationToTimeout(3.seconds)
override def afterAll(): Unit = actorSystem.terminate()
test("find just created actors") {
val actorRef = TestActorRef(Props(new TestActor()), "test-actor")
val timeout = Timeout.durationToTimeout(3.seconds)
val findFuture = actorSystem.actorSelection(actorRef.path).resolveOne()(timeout)
Await.result(findFuture, 10.seconds)
}
}
private class TestActor extends Actor {
override def receive: Receive = {
case _ =>
}
}
In diesem Beispiel wird TestActorRef nicht anstelle von Fehler verwendet. – Oleg
Sie versuchen, den testActorRef mit actorSelection zu suchen, so dass es tatsächlich an der Stelle des Fehlers verwendet wird. – johanandren
Gesucht werden bedeutet nicht, benutzt zu werden. – Oleg