0

ここで提供される情報を使用して、Akka FSM をテストしようとしています。TestFSMRefただし、サブクラスのActor with FSMインスタンス化にパラメーターが必要な場合の作成方法がわかりません。

標準の非 FSM テストでは、次のTestActorRefビアを作成します。

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

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

1 に答える 1

1

akka のサンプル FSM アクターからコードを盗んで、2 つのコンストラクター パラメーターを持つように少し調整したところ、次のようになりました。

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

通常、s コンストラクターを直接呼び出すことはありません(実行すると失敗します) が、aまたは aActorでラップすると、その制限を回避できます。これがコードを機能させるのに役立つことを願っています。TestActorRefTestFSMRef

于 2013-09-13T16:25:51.100 に答える