0

我正在尝试使用此处提供的信息测试 Akka FSM 。TestFSMRef但是,当我的子类Actor with FSM需要参数进行实例化时,我无法弄清楚如何创建一个。

对于标准的非 FSM 测试,我创建了TestActorRefvia:

val testActor = TestActorRef(MyActorFSM.props("nl", p1, p2))

根据记录的推荐做法实施该.props方法的地方。我尝试实例化 a然后将其传递给 TestFSMRef 构造函数:testActor

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]
4

1 回答 1

1

从 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 构造函数(如果这样做会失败),但是将其包装在 aTestActorRef或 aTestFSMRef中可以让您绕过该限制。我希望这可以帮助您使代码正常工作。

于 2013-09-13T16:25:51.100 回答