下のアクターがheartBeatExpireWorkerとheartBeatAccepterを作成していることを確認するテストを作成しようとしています。ScalaでAkkaアクターが作成されたことをテストするには
最初に、コンテキストの代わりにMockhito模擬やスパイを使用して、私がactorOfを呼び出したことを確認できたと思っていましたが、Akkaのテストフレームワークを破ることなくコンテキストを注入する方法を理解できません。
次に、私は自分が存在することを確認するために、特定のメッセージをワーカーに送信できると考えていました。しかし、Akka TestKitがテスト中の俳優の子供の俳優を作成していないように見えるので、それはうまくいかないと私は思いました。それは、近隣の俳優のために立つことができるTestprobesだけを取ることができます。親HeartBeatPumpWorker
のコンストラクタの子供(例えばHeartBeatAcceptWorker.props
)用
class HeartBeatPumpWorker(chatService: ChatService, target: HeartBeatMessageCmd) extends Actor with ActorLogging with
WorkersReference {
val heartBeatInterval = chatService.getHeartBeatInterval
val tick = context.system.scheduler.schedule(0 millis, heartBeatInterval millis, self, SendHeartBeat(target))
override def postStop() = tick.cancel()
def receive = {
case SendHeartBeat(command: HeartBeatMessageCmd) =>
log.debug("Sending heartbeat")
//Send heartbeat to GWT
val userTarget = NetworkWorker.buildEventUserTarget(command.getEventCode, command.getUser)
val uuid: String = UUID.randomUUID().toString
val freshCommand = new HeartBeatMessageCmd(command.getUser, command.getEventCode, uuid, command.getUserSession)
networkWorker ! NetworkBroadcast(userTarget, freshCommand)
val heartBeatId: String = freshCommand.getUuid
//create expirer
val heartBeatExpireWorkerRef = context.actorOf(HeartBeatExpireWorker.props(chatService, freshCommand),
HeartBeatExpireWorker.name(heartBeatId))
val heartBeatAccepterRef = context
.actorOf(HeartBeatAcceptWorker.props(chatService, freshCommand), HeartBeatAcceptWorker.name(heartBeatId))
//record heartbeat
chatService.saveSentHeartbeat(heartBeatId, freshCommand.getUserSession, freshCommand.getEventCode,
freshCommand.getUser,
freshCommand.getTimeCmdGenerated)
case _ =>
log.error("Pumper received unknown message. This shouldn't happen " + sender.path.toString)
self ! PoisonPill
}
}
object HeartBeatPumpWorker {
def name(eventCode: String, user: String, sessionId: String) = f"HeartBeatPumpWorker-$eventCode-$user-$sessionId"
def path(eventCode: String, user: String, sessionId: String) : String = {
EventWorker.Path + "/" + name(eventCode, user, sessionId)
}
def props(chatService: ChatService, heartBeatMsgCmd: HeartBeatMessageCmd) = {
Props(classOf[HeartBeatPumpWorker], chatService, heartBeatMsgCmd)
}
}
私にはわかりません。私は新しく生成されたheartBeatExpireWorkerRefとheartBeatAccepterRefのパスを定義するために着信引数を使用しているので、receiveメソッドでPropsを定義する必要があります。だから、私は小道具を注射することはできないと思う。 – HappyCoder86
それでは、メッセージを介してそれらを注入する必要があります。最後の手段として、メッセージを介して子の名前を注入し、子を 'ActorSelection'で見てみることができます。それは役に立ちますか? – agilesteel
それはいいようですが、Akka TestKitは俳優が子供の俳優を作ることを許可していますか?これまでに私が見つけたすべての例では、アクターがテストプローブとやりとりすることしかできません。テスト対象のアクターが子アクターを作成するサンプル・テストは見つかりませんでした。私はそのようなサンプルテストをどこで見つけることができるか知っていますか? – HappyCoder86