在演员 akka 的第三章中。它使用消息事件来测试静默actor的状态。
演员如下:
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
直接获得结果?
有些朋友似乎误解了我的问题。 书中说
使用
internalState
变量会遇到并发问题,所以应该使用GetState
事件告诉actor来获取actor的内部状态而不是直接使用internalState
。
我不知道为什么会遇到并发问题以及为什么使用GetState
可以解决问题
slientActor.internalState
无法直接获取内部变量,instand,使用silentActor.underlyingActor.internalState
就可以获得它。对于这个可怕的问题,我很抱歉。
答案 0 :(得分:1)
如果我正确理解你的问题,答案是测试代码中的silentActor不是actor,它是ActorRef实例,因此它没有要引用的internalState var。
如果要在ActorRef上为特定变量和方法编写单元测试,则需要使用documentation中描述的basActor技术(及其警告)。 (参见TestActorRef部分。