Akka FSM Testkit неправильно определяет *начальное состояние*

Я использую Akka FSM для моделирования движущегося лифта (вы собираетесь: не снова! :-)) и пытаюсь протестировать FSM, используя обычные функции Testkit, но, похоже, есть пробел либо в моем понимании, либо в опубликованном поведении FSM. (или оба).

Вот соответствующая часть кода:

class LiftCarriageWithMovingState (val movingStateSimulator: ActorRef) extends Actor
  with LoggingFSM[LiftState,LiftData]
  with ActorLogging
{
  val mxTimeToWaitStopping = 250 milliseconds
  private var pendingPassengerRequests: Vector[NextStop] = Vector.empty
  private var currentFloorID = 0 // Always start at Ground Floor

  val timeToReachNextFloor = 1000 millis  // up  or down, same time taken

  private val dontCare: StateFunction = {
    // ..
  }

  private val powerYourselfOff: StateFunction = {
    case Event(InstructedToPowerOff,_) =>
      stay
  }

  private val powerYourselfOn: StateFunction = {
    case Event(InstructedToPowerOn,_)  =>
      goto (PoweredOn)
  }

  private val beReady: StateFunction = {
    case Event(BeReady,_)          =>
      settleDownAtGroundFloor
      goto (Ready)
  }

  // .. other StateFunctions here

  startWith(PoweredOff,InitialData)

  when (PoweredOff) (powerYourselfOn orElse
                     dontCare)

  when (PoweredOn)  (powerYourselfOff orElse
                     beReady orElse
                     dontCare
  // ...

Можно ожидать, что FSM ответит сообщением CurrentState сразу после его создания и вызова функции startWith, но этого не происходит. Этот тест (снова частичный код) терпит неудачу:

"A LiftCarriage" must {
    "be ready, when it settles down after being PoweredOn" in {

      val testCarriageFSM = TestFSMRef(new LiftCarriageWithMovingState(movingStateSimulator))

      expectMsgPF() {
        case CurrentState(_,PoweredOff) => true // Line 46, see the stacktrace below
      }

таким образом:

 A LiftCarriage
[info] - must be ready, when it settles down after being PoweredOn *** FAILED ***
[info]   java.lang.AssertionError: assertion failed: timeout (3 seconds) during expectMsg:
[info]   at scala.Predef$.assert(Predef.scala:170)
[info]   at akka.testkit.TestKitBase$class.expectMsgPF(TestKit.scala:356)
[info]   at akka.testkit.TestKit.expectMsgPF(TestKit.scala:718)
[info]   at withExplicitMovingState.LiftCarriageMovingStoppingCorrectlyTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(LiftCarriageMovingStoppingCorrectlyTest.scala:46)
[info]   at withExplicitMovingState.LiftCarriageMovingStoppingCorrectlyTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(LiftCarriageMovingStoppingCorrectlyTest.scala:42)
[info]   at withExplicitMovingState.LiftCarriageMovingStoppingCorrectlyTest$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(LiftCarriageMovingStoppingCorrectlyTest.scala:42)

Есть ли пробел в моем понимании? Просветите меня, если что.

Я также вижу, что точно такой же вопрос - заданный в более обобщенной форме -the-first-state-in-an-akka">здесь - остался без ответа. Разве это не пробел в семантике Akka FSM и Testkit, который стоит устранить? :-П


person Nirmalya    schedule 08.11.2016    source источник