не работает стекируемый шаблон черт - невозможно изменить метод получения актера

У меня есть иерархия актеров, которую я хотел бы проверить на наличие сценариев ошибок - фактически протестировать прикладные стратегии супервайзеров. Мне нужно изменить метод получения актера, чтобы сообщение не подвело актера. Я нашел составной шаблон черты, но не могу заставить его работать. Мой код следует:

trait FailActor extends Actor {

  abstract override def receive = LoggingReceive {
     fail.orElse(super.receive)
  }
  def fail:Receive = {
    case "fail" => throw new RuntimeException("Test")
  }
}

class AddressTranslatorFailActor(storage: ActorRef) extends AddressTranslatorActor(storage) with FailActor

И в тесте, проходящем этот неудавшийся актер:

val probe = TestProbe()
  val addressServiceProps = Props {
    new AddressServiceActor {
      override def translateAddressProps = classOf[AddressTranslatorFailActor]
    }
  }

где акктор AddressService определяется следующим образом:

class AddressServiceActor extends Actor with ActorLogging {

  def translateAddressProps: Class[_<:AddressTranslatorActor] = classOf[AddressTranslatorActor]
...

Но по-прежнему получаю сообщение «сбой» без обработки. Любые подсказки?


person jaksky    schedule 13.02.2015    source источник
comment
Я не знаю, помогает ли это, но некоторое время назад у меня была похожая проблема, и использование реквизитов, таких как Props[YourActorClass with YourBehaviorTrait], не складывает поведение, в то время как Props(new YourActorClass with YourBehaviorTrait) складывает поведение в получение.   -  person ale64bit    schedule 13.02.2015
comment
Переопределение Props(...), которого я пытался избежать из-за передачи нескольких аргументов и т. д. Поэтому я попытался просто передать класс и создать реквизиты в родительском актере, который фактически создает этот. Кажется, что нет никакого способа избежать этого.   -  person jaksky    schedule 13.02.2015
comment
@kaktusito Я попробовал предложенный подход: переопределить def AddressTranslatorProps(adr: Address) = Props(new AddressTranslatorFailActor(storage)) но все еще получаю AddressTranslatorFailActor] akka://testsystem/user/AddressService/$a - ошибка получения необработанного сообщения Переопределил AddressServiceActor на def AddressTranslatorProps(adr: Address) = Props(classOf[AddressTranslatorActor], хранилище) Похоже, я не могу найти ни одного способа сделать это   -  person jaksky    schedule 13.02.2015
comment
Взгляните на ответ, который я дал здесь: stackoverflow.com/questions /28341337/strategy-pattern-in-akka. Это не принятый ответ, но это может быть что-то близкое к тому, что вам нужно.   -  person cmbaxter    schedule 13.02.2015
comment
@cmbaxter Спасибо. Одно мне до сих пор не ясно: почему это не работает?   -  person jaksky    schedule 16.02.2015