2017-09-28 10 views
2

TestActorRef.apply()を使用してアクターを作成すると、Future内でactorSystem.actorSelection.resolveOneを呼び出して解決できない場合があります。TestActorRefで作成されたアクターを時々解決できません

TestActorRefのドキュメントでは、シングルスレッド環境で使用できると言われていますが、次のテストが失敗する理由は何でしょうか。

アッカバージョン:失敗2.4.16

最小限のテスト、エラー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 _ => 
    } 
} 

答えて

0

はドキュメントに大きな警告ボックスで指摘したようhereテスト俳優refがあります非同期テストでのみ使用することはできません(アクターの選択を行った場合など)。

+0

この例では、TestActorRefはエラーの代わりに使用されていません。 – Oleg

+0

actorSelectionを使用してtestActorRefを表示しようとしているため、実際にはエラーの場所で使用されています。 – johanandren

+0

doestが検索されていることは、使用されているわけではありません。 – Oleg

関連する問題