我是Akka和Scala的新手,我來自非併發世界。也許我做了很多錯事,我會很感激反饋,即使它與問題無關。Akka Actors單元測試模型
我正在做一個簡單的聊天應用程序與阿卡和斯卡拉。我通過「輸入功能」開始了(bc業務需求)......這是whatsapp或tellegram中的典型特徵「John正在輸入消息」。
我已經使用兩種演員類型對它進行了建模:Talkers和Conversation,並且我想單元測試我的Conversation actor。我的對話演員看起來像這樣:
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和阿卡編碼我曾測試此類似:
- 我得到我的對話演員
- 我嘲笑健談
- 我發送消息打字我的演員
- 我希望健談應該被通知
我真的不知道它是否是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列表是正確的Actor?
我搜索了文檔,但我認爲有很多太舊,我不確定代碼示例是否仍然有效。
謝謝您的時間傢伙,而這個noob問題不好意思:=)
嗨Jazmit,謝謝您的回答。當然,我知道我的測試是一個愚蠢的測試。當然,我也會做一些集成測試,但我從容易的東西開始:P因此,在你看來,爲了做這個虛擬測試,我應該嘲笑我的講話者,我應該使用一個模擬框架嗎?你推薦我一個嗎?有什麼方法可以直接使用Teskit來做到這一點?再次感謝您的時間:) – SergiGP
我建議使用ScalaMock,添加一個鏈接到答案。 TestKit是用於異步測試的,你不需要它來進行簡單的同步測試 – jazmit
你可能有些運氣使用TestProbe來嘲諷actor Refs,但遲早你需要嘲笑其他依賴的框架 – jazmit