Сбой самого масштабного, когда актер akka выдает исключение за пределами тестового потока

У меня была ситуация, когда я несколько раз кусал меняm тестирование Actor и Actor неожиданно выдает исключение (из-за ошибки), но тест все равно проходит. Теперь в большинстве случаев исключение в Actor означает, что независимо от того, что тест проверяет, выигралне получается правильно, так что тест не пройден, но в редких случаяхне правда. Исключение возникает в другом потоке, чем у тестера, поэтому тестер ничего об этом не знает.

Один пример, когда яЯ использую макет для проверки вызова некоторой зависимости, и из-за ошибки в коде Actor я вызываю неожиданный метод в макете. Это заставляет насмешку выдавать исключение, которое взрывает актера, но не тест. Иногда это может даже вызватьвниз по течению испытания загадочным образом провалились из-за того, как взорвался актер. Например:"

// using scala 2.10, akka 2.1.1, scalatest 1.9.1, easymock 3.1
// (FunSpec and TestKit)
class SomeAPI {
  def foo(x: String) = println(x)
  def bar(y: String) = println(y)
}

class SomeActor(someApi: SomeAPI) extends Actor {
  def receive = {
    case x:String  =>
      someApi.foo(x)
      someApi.bar(x)
  }
}

describe("problem example") {
  it("calls foo only when it receives a message") {
    val mockAPI = mock[SomeAPI]
    val ref = TestActorRef(new SomeActor(mockAPI))

    expecting {
      mockAPI.foo("Hi").once()
    }

    whenExecuting(mockAPI) {
      ref.tell("Hi", testActor)
    }
  }

  it("ok actor") {
    val ref = TestActorRef(new Actor {
      def receive = {
        case "Hi"  => sender ! "Hello"
      }
    })
    ref.tell("Hi", testActor)
    expectMsg("Hello")
  }
}

problemExample» проходит, но потом вниз по течениюок актер не получается по какой-то причине я неЯ действительно понимаю ... с этим исключением:

cannot reserve actor name '$b': already terminated
java.lang.IllegalStateException: cannot reserve actor name '$b': already terminated
at       akka.actor.dungeon.ChildrenContainer$TerminatedChildrenContainer$.reserve(ChildrenContainer.scala:86)
at akka.actor.dungeon.Children$class.reserveChild(Children.scala:78)
at akka.actor.ActorCell.reserveChild(ActorCell.scala:306)
at akka.testkit.TestActorRef.(TestActorRef.scala:29)

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

Приложение: я посмотрел на TestEventListener и подозреваю тамМожет быть, есть что-то, что могло бы помочь, но я могуне вижу этого. Единственная документация, которую я смог найти, касалась ее использования для проверки ожидаемых, а не неожиданных исключений.

Ответы на вопрос(3)

Ваш ответ на вопрос