2015-12-04 17 views
5

俳優がakkaで停止しているかどうかをテストするのが標準的な方法であると思います。ここに私が現在やっていることの例があります。私はそれを複雑にすることを心配しています。akka:俳優が停止したことをテストする方法

import akka.actor.{Terminated, Actor, Props, ActorSystem} 
import akka.testkit.TestProbe 

class MyActor extends Actor { 
    import MyActor._ 
    override def receive: Receive = { 
    case Stop => context.stop(self) 
    } 
} 

object MyActor { 
    def props = Props(new MyActor) 
    case object Stop 
} 


object MyActorSpec { 

    val system = ActorSystem() 
    val myActor = system.actorOf(MyActor.props) 
    val testProbe = TestProbe() 

    case object MyActorStopped 

    val watcher = system.actorOf(Props(new Actor { 
    context.watch(myActor) 
    override def receive: Actor.Receive = { 
     case Terminated(`myActor`) => testProbe.ref ! MyActorStopped 
    } 
    })) 

    myActor ! MyActor.Stop 
    testProbe.expectMsg(MyActorStopped) 
} 

答えて

17

あなたは別のウォッチャー俳優を取り除くと、ちょうどtestProbe俳優から直接ターゲット俳優を見ることができます:

val testProbe = TestProbe() 
testProbe watch myActor 
myActor ! MyActor.Stop 
testProbe.expectTerminated(myActor) 

は、アッカのテストドキュメントの関連セクションのためのhereを参照してください。

+0

優秀 - 私はこのようなことを望んでいました。どのように私がそれを逃したかわからない乾杯。 – Mullefa

+0

'ActorRef'を取得して' expectTerminated() 'メソッドに渡すことが困難な場合にも、追加したいと思います。 refは別の俳優の子供として作成されました。私は停止したrefをキャプチャすることが有用であることを発見しました。それは名前です: 'val msg = testProbe.expectMsgType [Terminated]; assert(msg.actor.path.name == "myActor") ' – Mullefa

+0

testProbeの代わりにtestActorを使用すると何か問題はありますか? 'この時計myActor' ' myActor! MyActor.Stop' 'expectTerminated(myActor)' –

関連する問題