Как правильно протестировать поведение актера в случае сбоя

Очень важно знать, как система может вести себя в случае сбоя определенного субъекта - как выполняется восстановление, правильно ли получены снимки и т. Д. Удивительно, но я не нашел никаких советов по этому поводу в документы

Подход, который я видел в некоторых примерах, заключается в том, чтобы иметь специальное сообщение Fail и позволить актеру выдавать Exception в это сообщение.

class MyActor extends Actor {
  override def receive =
    ...
    case Fail => throw new Exception("kaboom")
}

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

Как мне заставить произвольного актера проиграть должным образом?

Спасибо


person kostja    schedule 04.08.2016    source источник


Ответы (1)


Поразмыслив, я нашел быстрое решение. Пакет test содержит признак неудачи, который затем смешивается с участниками для проверки отказа:

object Failing{
  case object Fail
}

trait Failing {
  def failOnMsg: PartialFunction[Any, Unit] = {
    case Fail => throw new Exception("kaboom!")
  }
}

затем в тесте PF добавляется к исходному receive

val props = Props(new MyActor(arg) with Failing {
  override def receive = failOnMsg orElse super.receive
})

val actor = system.actorOf(props)
actor ! Fail

Это все еще лучше, чем то, что было у меня раньше, но в нем есть какой-то шаблон. Я надеюсь, что есть решение получше.

person kostja    schedule 04.08.2016