Сбой самого масштабного, когда актер 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 и подозреваю тамМожет быть, есть что-то, что могло бы помочь, но я могуне вижу этого. Единственная документация, которую я смог найти, касалась ее использования для проверки ожидаемых, а не неожиданных исключений.