2017-09-28 1 views
2

Si un acteur est créé à l'aide de TestActorRef.apply(), il peut être impossible de le résoudre en appelant actorSystem.actorSelection.resolveOne dans un avenir.Les acteurs créés avec TestActorRef ne peuvent pas être résolus parfois

Le document pour TestActorRef indique qu'il peut être utilisé dans un environnement monothread, mais je me demande quelle est la raison pour laquelle le test suivant échoue.

Version Akka: 2.4.16

test minimal qui échoue, si elle est exécutée 1000 fois avec erreur 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 _ => 
    } 
} 

Répondre

0

Comme il est indiqué avec une grande boîte d'avertissement dans la documentation here l'arbitre acteur de test est pour les tests synchrones seulement et ne peut pas être utilisé en toute sécurité dans les tests asynchrones (comme celui qui est montré en faisant une sélection d'acteur).

+0

Dans cet exemple, TestActorRef n'est pas utilisé à la place de l'erreur. – Oleg

+0

Vous essayez de regarder le testActorRef en utilisant actorSelection, donc il est en fait utilisé à la place de l'erreur. – johanandren

+0

Être recherché pour le doest ne signifie pas être utilisé. – Oleg