Я тестирую, как новый Actor
Я работаю над обработкой неожиданных сообщений. Я хотел бы утверждать, что он бросает GibberishException
в этих случаях. Вот тест и реализация до сих пор:Как получить информацию об исключениях от Супервизора Akka?
Тест:
"""throw a GibberishException for unrecognized messages""" in {
//define a service that creates gibberish-speaking repositories
val stubs = new svcStub(
actorOf(new Actor{
def receive = { case _ => {
self.channel ! "you're savage with the cabbage"
}
}
})
)
val model = actorOf(new HomeModel(stubs.svc,stubs.store))
val supervisor = Supervisor(
SupervisorConfig(
OneForOneStrategy(List(classOf[Exception]), 3, 1000),
Supervise(model,Permanent) :: Nil
)
)
try{
intercept[GibberishException] {
supervisor.start
model !! "plan"
}
} finally {
supervisor.shutdown
}
stubs.store.plan should equal (null)
stubs.svcIsOpen should be (false)
}
Реализация:
class HomeModel(service: PlanService, store: HomeStore)
extends Actor {
private val loaderRepo = service.getRepo()
private var view: Channel[Any] = null
override def postStop() = {
service.close()
}
def receive = {
case "plan" => {
view=self.channel
loaderRepo ! LoadRequest()
}
case p: Plan => {
store.plan=p
view ! store.plan
}
case _ => throw new GibberishException(_)
}
}
Однако, когда я запускаю тест, детали исключения добраться до Supervisor
я создал, но Я не знаю, как с ними что-то делать (например, регистрировать их или тестировать их тип). Я хотел бы получить информацию об исключениях от супервизора, чтобы я мог реконструировать и перехватить их в своем тесте. Вне метода тестирования я мог представить, что это полезно, если вы хотите сообщить о природе исключения в пользовательском интерфейсе работающего приложения. Есть ли способ получить это от Supervisor
, когда это произойдет?
Но как я могу регистрироваться или иным образом воздействовать на исключение из Supervisor? Я не вижу, где есть крючок, чтобы добавить код обработки ошибок. Я понимаю, что он перезапустит актера, но что, если я хочу сделать что-то большее, чем это, например, регистрировать исключение или отображать сообщение пользователю? – traffichazard
Исключение уже зарегистрировано Akka Если вы хотите отправить сообщение пользователю, используйте !!! вместо ! и у вас будет исключение в будущем. –
Изменение стратегии обработки GibberishException только и замена !! в блоке 'intercept' теста с !!! а затем «get» на будущее, которое он возвращает, дает мне тот же результат. «GibberishException» отключается неотображаемым, сбрасывается в мою командную строку, а ScalaTest терпит неудачу с тестом «Expected exception org.thimblus.model.GibberishException», но выбрано исключение akka.dispatch.FutureTimeoutException. «Похоже, что исключение получая брошенный в другой поток, чем тот, где тест ждет его. – traffichazard