Привет коллеги-кодеры и уважаемые гуру,
У меня есть действующее лицо, реализующее FSM
, которое требуется для создания исключения IOException для определенных сообщений в определенном состоянии (Busy), которое должно быть перезапущено его Supervisor.
отрывок:
case class ExceptionResonse(errorCode: Int)
when(Busy) {
case ExceptionResponse(errorCode) =>
throw new IOException(s"Request failed with error code $errorCode")
}
Я пытаюсь проверить это поведение, используя TestActorRef
и вызывая receive
непосредственно для этого, ожидая, что получение вызовет IOException
.
case class WhenInStateBusy() extends TestKit(ActorSystem()) with After {
val myTestFSMRef = TestFSMRef(MyFSM.props)
...
def prepare: Result = {
// prepares tested actor by going through an initialization sequence
// including 'expectMsgPfs' for several messages sent from the tested FSM
// most of my test cases depend on the correctness of that initialization sequence
// finishing with state busy
myTestFSMRef.setState(Busy)
awaitCond(
myTestFSMRef.stateName == Busy,
maxDelay,
interval,
s"Actor must be in State 'Busy' to proceed, but is ${myTestFSMRef.stateName}"
)
success
}
def testCase = this {
prepare and {
myTestFSMRef.receive(ExceptionResponse(testedCode)) must throwAn[IOException]
}
}
}
Примечание. Последовательность инициализации гарантирует, что тестируемый FSM полностью инициализирован и настроил свое внутреннее изменяемое состояние. Состояние Busy можно оставить только тогда, когда актер получает сообщение определенного типа, которое в моей тестовой настройке должно быть предоставлено тестовым набором, поэтому я почти уверен, что FSM находится в правильном состоянии.
Теперь на моем сервере Jenkins (Ubuntu 14.10) этот тестовый пример терпит неудачу примерно в 1 из 20 попыток (-> исключение не выдается). Однако на моей машине разработки (Mac Os X 10.10.4) я не могу воспроизвести ошибку. Так что отладчик мне не помогает.
Тесты запускаются последовательно, и после каждого примера тестовая система выключается.
- Java версии 1.7.0_71
- Скала версии 2.11.4
- Акка версии 2.3.6
- Спец2 версия 2.3.13
Кто-нибудь может объяснить, почему иногда вызов myTestActorRef.receive(ExceptionResponse(testedCode))
не приводит к Exception
?
myTestActorRef
. Это опечаткаmyTestFSMRef
или это два разных объекта? - person mattinbits   schedule 13.08.2015