Акка 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)
Есть ли пробел в моем понимании? Пожалуйста, просветите меня, если так.
Я также вижу, что точно такой же вопрос, заданный здесь в более краткой форме, остался без ответа. Разве это не является пробелом в семантике Akka FSM и Testkit, который стоит устранить?:-П