在 akka testkit 中,为什么使用事件而不是普通方法获取 actor 状态?
In akka testkit,why use a event rather then a normal method get the actor state?
akka 的书中演员的第三章。它使用消息事件来测试无声演员的状态。
演员如下:
object SilentActorProtocol {
case class SilentMessage(data: String)
case class GetState(receiver: ActorRef)
}
class SilentActor extends Actor {
import SilentActorProtocol._
var internalState = Vector[String]()
def receive = {
case SilentMessage(data) =>
internalState = internalState :+ data
case GetState(receiver) => receiver ! internalState
}
}
测试代码如下:
"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 ! GetState(testActor)
expectMsg(Vector("whisper1", "whisper2"))
}
在测试代码中为什么使用 GetState 获取上述 SilentMessage
事件的结果。
为什么不用slientActor.internalState
直接得到结果呢?
更新
有些朋友好像误导了我的problem.For详情,
书上说
use the internalState
variable will encounter concurrency problem, so there should use a GetState
event tell actor to get the actor's inner state rather then use internalState
straightly.
我不知道为什么会遇到并发问题,为什么使用GetState
可以解决问题
解释一下
slientActor.internalState
不能直接获取内部变量,直接用silentActor.underlyingActor.internalState
可以获取it.So不好意思问了。
如果我没有理解你的问题,答案是测试代码中的silentActor不是actor,它是ActorRef实例,因此它没有internalState var被引用。
如果您想为 ActorRef 上的特定变量和方法编写单元测试,您需要使用 documentation 中描述的底层 Actor 技术(及其注意事项)。 (请参阅有关 TestActorRef 的部分。
akka 的书中演员的第三章。它使用消息事件来测试无声演员的状态。
演员如下:
object SilentActorProtocol {
case class SilentMessage(data: String)
case class GetState(receiver: ActorRef)
}
class SilentActor extends Actor {
import SilentActorProtocol._
var internalState = Vector[String]()
def receive = {
case SilentMessage(data) =>
internalState = internalState :+ data
case GetState(receiver) => receiver ! internalState
}
}
测试代码如下:
"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 ! GetState(testActor)
expectMsg(Vector("whisper1", "whisper2"))
}
在测试代码中为什么使用 GetState 获取上述 SilentMessage
事件的结果。
为什么不用slientActor.internalState
直接得到结果呢?
更新
有些朋友好像误导了我的problem.For详情, 书上说
use the
internalState
variable will encounter concurrency problem, so there should use aGetState
event tell actor to get the actor's inner state rather then useinternalState
straightly.
我不知道为什么会遇到并发问题,为什么使用GetState
可以解决问题
解释一下
slientActor.internalState
不能直接获取内部变量,直接用silentActor.underlyingActor.internalState
可以获取it.So不好意思问了。
如果我没有理解你的问题,答案是测试代码中的silentActor不是actor,它是ActorRef实例,因此它没有internalState var被引用。
如果您想为 ActorRef 上的特定变量和方法编写单元测试,您需要使用 documentation 中描述的底层 Actor 技术(及其注意事项)。 (请参阅有关 TestActorRef 的部分。