2011-08-07 8 views
1

Я тестирую, как новый 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, когда это произойдет?

ответ

3

Измените OneForOneStrategy, чтобы обрабатывать только GibberishException, следует решить эту проблему.

+0

Но как я могу регистрироваться или иным образом воздействовать на исключение из Supervisor? Я не вижу, где есть крючок, чтобы добавить код обработки ошибок. Я понимаю, что он перезапустит актера, но что, если я хочу сделать что-то большее, чем это, например, регистрировать исключение или отображать сообщение пользователю? – traffichazard

+0

Исключение уже зарегистрировано Akka Если вы хотите отправить сообщение пользователю, используйте !!! вместо ! и у вас будет исключение в будущем. –

+0

Изменение стратегии обработки GibberishException только и замена !! в блоке 'intercept' теста с !!! а затем «get» на будущее, которое он возвращает, дает мне тот же результат. «GibberishException» отключается неотображаемым, сбрасывается в мою командную строку, а ScalaTest терпит неудачу с тестом «Expected exception org.thimblus.model.GibberishException», но выбрано исключение akka.dispatch.FutureTimeoutException. «Похоже, что исключение получая брошенный в другой поток, чем тот, где тест ждет его. – traffichazard