我正在尝试使用information provided here测试Akka FSM。但是,当TestFSMRef
的子类需要参数进行实例化时,我无法弄清楚如何创建Actor with FSM
。
对于标准的非FSM测试,我通过以下方式创建TestActorRef
:
val testActor = TestActorRef(MyActorFSM.props("nl", p1, p2))
根据documented Recommended Practice实施.props
方法。我已经尝试实例化testActor
然后将其传递给TestFSMRef构造函数:
val fsm = TestFSMRef(testActor)
但是没有编译:
inferred type arguments [Nothing,Nothing,akka.testkit.TestActorRef[Nothing]]
do not conform to method apply's type parameter bounds [S,D,T <: akka.actor.Actor]
答案 0 :(得分:1)
从akka的示例FSM actor中窃取代码,我稍微调整了一下有两个构造函数params,它现在看起来像这样:
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
构造函数(如果这样做会失败),但将其包装在TestActorRef
或TestFSMRef
中会让您获得围绕这个限制。我希望这可以帮助您使代码正常工作。