2017-09-28 2 views
2

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 _ => 
    } 
} 

Antwort

0

Wie bei einem großen Warnbox in der Dokumentation festgestellt here der Test Schauspieler ref nur für synchrone Tests und kann nicht sicher in Async-Tests verwendet werden (wie z. B. bei der gezeigten Auswahl von Actors).

+0

In diesem Beispiel wird TestActorRef nicht anstelle von Fehler verwendet. – Oleg

+0

Sie versuchen, den testActorRef mit actorSelection zu suchen, so dass es tatsächlich an der Stelle des Fehlers verwendet wird. – johanandren

+0

Gesucht werden bedeutet nicht, benutzt zu werden. – Oleg

Verwandte Themen