【问题标题】:Testing akka FSM with futures使用期货测试 akka FSM
【发布时间】:2014-03-20 15:03:24
【问题描述】:

我有一个在各州使用期货的 akka FSM 演员。例如:

when(StateA) {
  case Event(str: String, _) =>
    if (str == "ping") {
      Future("await-ping").pipeTo(self)(sender)
      goto(AwaitStateA)
    } else {
      stay() replying "stay-ping"
    }
}

when(AwaitStateA) {
  case Event(str: String, _) =>
  goto(StateA) replying str
}

使用akka testkit对上面的actor进行测试:

val adaptation: TestFSMRef[State, Data, _ <: Actor]

"Switch between states A" must {
  "should return `await-ping`" in {
    adaptation ! "ping"
    expectMsg("await-ping")
    adaptation.stateName should be(StateA)
  }
  "should return `stay-ping`" in {
    adaptation ! "pong"
    expectMsg("stay-ping")
    adaptation.stateName should be(StateA)
  }
}

您可以在 github 上找到完整的测试代码:https://github.com/azhur/fsmtest

问题是测试随机失败(有时它们都通过了)。 测试“应该返回 await-ping”->“AwaitStateA 不等于 StateA”中出现故障。 请帮忙找出我错在哪里。

我尝试从命令行和 IDE (Intellij IDEA) 运行测试。结果是一样的。当我单独运行每个测试时,很难发现失败。

【问题讨论】:

    标签: intellij-idea akka fsm


    【解决方案1】:

    未来在全局 ExecutionContext(您已导入)上运行,并且在它与 TestFSMRef 使用的调用线程调度程序之间存在竞争。

    我不会在这里使用 TestFSMRef。如果验证状态转换很重要,您可以改用 FSM 转换侦听器。像这样的:

    val adaptation: ActorRef = system.actorOf(Props[FsmSwitcher1])
    
    "should return `await-ping`" in {
      val transitionListener = TestProbe()
      adaptation ! SubscribeTransitionCallBack(transitionListener.ref)
      transitionListener.expectMsg(CurrentState(adaptation, StateA))
      adaptation ! "ping"
      expectMsg("await-ping")
      transitionListener.expectMsg(Transition(adaptation, StateA, AwaitStateA))
      transitionListener.expectMsg(Transition(adaptation, AwaitStateA, StateA))
    }
    

    【讨论】:

    • 谢谢帕特里克的回答。问题是我想测试成对的其他类似状态(StateB -> AwaitStateB)。 FSM 在状态 A 开始。使用您的代码,我可以在状态 StateB 中启动 FSM(在 TestFSMRef adaption.setState(StateB, _) 中)吗?
    • 我建议使用 TestFSMRef 开始测试,然后使用 Patrik 的方法来验证正确的转换。
    猜你喜欢
    • 1970-01-01
    • 2013-04-12
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2017-03-13
    • 2015-07-07
    • 2019-02-10
    相关资源
    最近更新 更多