从akka的示例FSM actor那里窃取了代码,我对其进行了一些调整,使其具有两个构造函数参数,现在看起来是这样的:
class MyFSMActor(foo:String, bar:Int) extends Actor with FSM[State,Data]{
println(s"My foo = $foo and my bar = $bar")
startWith(Idle, Uninitialized)
when(Idle) {
case Event(SetTarget(ref), Uninitialized) =>
stay using Todo(ref, Vector.empty)
}
// transition elided ...
when(Active, stateTimeout = 1 second) {
case Event(Flush | StateTimeout, t: Todo) =>
goto(Idle) using t.copy(queue = Vector.empty)
}
// unhandled elided ...
initialize()
}
然后,我可以创建一个测试引用,如下所示:
val test = TestFSMRef(new MyFSMActor("hello", 1))
println(test.stateName)
当我这样做的时候,我看到:
My foo = hello and my bar = 1
Idle
您通常不会调用
Actor
s构造函数(如果这样做,它将失败),但将其包装在
TestActorRef
或
TestFSMRef
会让你绕过这个限制。我希望这能帮助您使代码正常工作。