如何用参数构造akka TestFSMRef?

时间:2013-09-13 12:47:04

标签: scala akka fsm

我正在尝试使用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]

1 个答案:

答案 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构造函数(如果这样做会失败),但将其包装在TestActorRefTestFSMRef中会让您获得围绕这个限制。我希望这可以帮助您使代码正常工作。