Актер не перехватывает исключение в тесте, даже если его бросили

Мой Actor выглядит так

object LogProcessorActor {
  def props(f: () => Unit): Props = Props(new LogProcessorActor(f))
}

class LogProcessorActor(f: () => Unit) extends Actor with ActorLogging {
  def receive = LoggingReceive {
    case StartLogReaderDisruptor => f()
      sender ! StartedLogReaderDisruptor
  }
}

а мой test выглядит так

  it must "fail with method throws exception" in {
    val f: () => Unit = () => 2/0
    val logProcessorRef = TestActorRef[LogProcessorActor](LogProcessorActor.props(f), name = "logProcessorSad")
    intercept[ArithmeticException] {
      logProcessorRef ! StartLogReaderDisruptor
    }
  }

Я вижу в логах, что выбрасывается исключение

[DEBUG] [06/02/2015 19:25:44.598] [ScalaTest-run] [EventStream(akka://logProcessorActorSystem)] logger log1-Slf4jLogger started
[DEBUG] [06/02/2015 19:25:44.599] [ScalaTest-run] [EventStream(akka://logProcessorActorSystem)] Default Loggers started
02 Jun 2015 19:25:44,601 [DEBUG] [logProcessorActorSystem-akka.actor.default-dispatcher-3] akka.event.EventStream| logger log1-Slf4jLogger started
02 Jun 2015 19:25:44,603 [DEBUG] [logProcessorActorSystem-akka.actor.default-dispatcher-3] akka.event.EventStream| Default Loggers started02 Jun 2015 19:25:44,782 [ERROR] [logProcessorActorSystem-akka.actor.default-dispatcher-3] akka.actor.OneForOneStrategy| / by zero
java.lang.ArithmeticException: / by zero
    at com.shn.lp.LogProcessorActorSpec$$anonfun$3$$anonfun$4.apply$mcV$sp(LogProcessorActorSpec.scala:18)
    at com.shn.lp.LogProcessorActor$$anonfun$receive$1.applyOrElse(LogProcessorActor.scala:16)
    at akka.actor.Actor$class.aroundReceive(Actor.scala:467)
    at com.shn.lp.LogProcessorActor.aroundReceive(LogProcessorActor.scala:14)
    at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)

Но все же мой тест терпит неудачу, поскольку

Expected exception java.lang.ArithmeticException to be thrown, but no exception was thrown.
ScalaTestFailureLocation: com.shn.lp.LogProcessorActorSpec$$anonfun$3 at (LogProcessorActorSpec.scala:20)
org.scalatest.exceptions.TestFailedException: Expected exception java.lang.ArithmeticException to be thrown, but no exception was thrown.

Я даже попробовал стратегию, упомянутую в документах, но я все еще получаю тот же результат.

Что я делаю неправильно?


person daydreamer    schedule 03.06.2015    source источник
comment
пользовательский актер receive, который доступен в TestActorRef вместо tell или !.   -  person Johny T Koshy    schedule 03.06.2015
comment
@johny, ты должен указать это в качестве ответа   -  person nickebbitt    schedule 03.06.2015


Ответы (1)


Неперехваченное исключение, созданное в блоке получения актора, не будет обрабатываться отправителем. Это будет обрабатываться в соответствии с иерархией супервайзера актера. Родительский актор будет иметь дело с ребенком в соответствии со своей стратегией супервизора.

Это описано в разделе Актеры и исключения документации: http://doc.akka.io/docs/akka/2.3.11/scala/actors.html#Actors_and_exceptions

person Ryan    schedule 03.06.2015