Akka TestKitテストパッケージの使用
6438 ワード
Akka TestKitテストパッケージの使用
TestKit、テストクラスはいくつかのインタフェースを継承する必要があります.
class SendingActor01Test extends TestKit(ActorSystem("testsystem")) //TestKit testsystem
with WordSpecLike // must,in
with MustMatchers //must assertion, "hello" must (contain("hello"))
with StopSystemAfterAll { // system
"A Silent Actor" must { //
"change state when it receives a message, single threaded" in { // in
//Write the test, first fail
fail("not implemented yet")
}
"change state when it receives a message, multi-threaded" in {
//Write the test, first fail
fail("not implemented yet")
}
}
}
これらのインタフェースは、actor testsystem、testActorを初期化し、テストを終了し、クリーンアップを実現します.
テスト環境は次のとおりです.
シングルスレッドマルチスレッドマルチJVM
シングルスレッド
この環境では、TestActorRefを使用してsilentActor内部に直接アクセスできる簡単なテストが一般的です.
//
"A Silent Actor" must {
"change internal state when it receives a message, single" in {
import SilentActorProtocol._
//actor , TestActorRef silentActor
val silentActor = TestActorRef[SilentActor]
silentActor ! SilentMessage("whisper")
// silentActor ,
silentActor.underlyingActor.state must (contain("whisper"))
}
}
TestActorRefとLocalActorRefは、スケジューラとしてテスト用のCallingThreadDispatcherのみを使用し、CallingThreadDispatcherは新しいスレッドでactorを呼び出さない
マルチスレッド環境
直接actorにアクセスできないため、testActorでactorのメッセージを取得するしかありません.たとえば、次のようにします.
// , actor , testActor
"A Silent Actor" must {
"change internal state when it receives a message, multi" in {
import SilentActorProtocol._
val silentActor = system.actorOf(Props[SilentActor], "s3")
silentActor ! SilentMessage("whisper1")
silentActor ! SilentMessage("whisper2")
//silentActor testActor
silentActor ! GetState(testActor)
//expectMsg testActor message
expectMsg(Vector("whisper1", "whisper2"))
}
expectMsg,expectMsgPFメソッドはtest actorからのメッセージを受信する.したがって、actorに対応するmessageをテストする場合は、testActorにメッセージを送信し、testActorを私たちのテスト方法に転送することができます.
マルチJVM環境
discuss on chapter 5
actorを分類します.次の3つがあります.
1. SilentActor
メッセージは返さずに送信されません.メッセージを受け入れたかどうか、内部状態を変えたかどうか、異常を投げたかどうかをテストします.単一スレッド環境では、TestActorRefを使用します.マルチスレッド環境ではtestActorを使用します.
2. SendingActor
他のactorにメッセージを送信します.一般的にブラックボックスとしてテストします.testActorを使用してメッセージを受信し、expectMsgまたはexpectMsgPFを使用してtestActorからテストされたactorから受信したメッセージを取得します.
3.SideEffectingActor
メッセージを受け入れ、いくつかのobjectとインタラクティブにします.メッセージを送信するとobjectが変動していることを検出します
TestProbe
TestKitはtestActorを提供しています.
expectMsg
expectNoMsg
ignoreMsg
expectMsgPF
などの方法でtestActorが受け入れるmessageを取得する.複数のactorに送信されるメッセージを受信する場合は、TestProbeを使用して
TestProbe()
を直接呼び出す必要があります.まとめ
ほとんどの場合、testActorテストが最も便利です.