私は Akka と Scala の初心者であり、非並行世界の出身です。おそらく私は多くのことを間違っています。質問に関係なくても、フィードバックをいただければ幸いです。
Akka と Scala で簡単なチャット アプリケーションを作成しています。私は(bcビジネス要件)「入力機能」から始めました...これは、「ジョンがメッセージを入力している」というwhatsappまたは電報の典型的な機能です。
Talkers と Conversation の 2 つのアクター タイプを使用してモデル化し、Conversation アクターを単体テストしたいと考えています。私の会話アクターは次のようになります。
object Conversation {
def props(conversationId: UUID, talkers: List[ActorRef])(out: ActorRef) = Props(new Conversation(conversationId, talkers))
case class Typing(talkerId: TalkerId)
}
class Conversation(conversationId: UUID, talkers: List[ActorRef]) extends Actor with ActorLogging {
def receive = LoggingReceive {
case Typing(talkerId) =>
// notify all talkers that a talker is typing
// @TODO don't notify user which is typing
talkers foreach {talker: ActorRef => talker ! InterlocutorTyping(talkerId)}
}
}
私は、今では非常に単純だと思います。したがって、Scala と Akka でコーディングを開始する前に、次のようにテストしました。
- 会話アクターを取得します
- 私は話者をからかう
- アクターにメッセージを送信します
- 話者に通知する必要があると思います
それが Scala と Akka で正しいアプローチであるかどうかはよくわかりません。私のテスト(scalatestを使用)は次のようになります。
"Conversation" should {
"Notify interlocutors when a talker is typing" in {
val talkerRef1 = system.actorOf(Props())
val talkerRef2 = system.actorOf(Props())
val talkerRef1Id = TalkerIdStub.random
val conversationId = UUID.randomUUID()
val conversationRef = system.actorOf(Props(classOf[Conversation], conversationId, List(talkerRef1, talkerRef2)))
// should I use TestActorRef ?
conversationRef ! InterlocutorTyping(talkerRef1Id)
// assert that talker2 is notified when talker1 is typing
}
}
TestActorRef を使用する必要がありますか? TestProbe() を使用する必要がありますか (これは統合テスト用であると読みました)
Talker モックを作成するにはどうすればよいですか? このアプローチは正しいですか?
トーカーのリストを会話アクターに挿入するのは正しいですか?
ドキュメントを検索しましたが、古すぎると思います。コード例がまだ機能しているかどうかはわかりません。
お時間をいただきありがとうございます。初心者の質問で申し訳ありません:=)