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 _ =>
}
}
Dans cet exemple, TestActorRef n'est pas utilisé à la place de l'erreur. – Oleg
Vous essayez de regarder le testActorRef en utilisant actorSelection, donc il est en fait utilisé à la place de l'erreur. – johanandren
Être recherché pour le doest ne signifie pas être utilisé. – Oleg