Как создать TestActorRef внутри тестового класса для Актера с параметрами конструктора?

Как создать TestActorRef внутри тестового класса. В частности, у меня есть следующий тест...

class MatchingEngineSpec extends TestKit(ActorSystem("Securities-Exchange"))
  with FeatureSpecLike
  with GivenWhenThen
  with Matchers {

  val google = Security("GOOG")

  val ticker = Agent(Tick(google, None, None, None))

  val marketRef = TestActorRef(new DoubleAuctionMarket(google, ticker) with BasicMatchingEngine)

  val market = marketRef.underlyingActor

... когда я запускаю тесты, все проходит, но после закрытия ActorSystem я получаю эту длинную трассировку ошибки ...

[ERROR] [03/10/2015 15:07:55.571] [Securities-Exchange-akka.actor.default-dispatcher-4] [akka://Securities-Exchange/user/$$b]     Could not instantiate Actor
Make sure Actor is NOT defined inside a class/trait,
if so put it outside the class/trait, f.e. in a companion object,
OR try to change: 'actorOf(Props[MyActor]' to 'actorOf(Props(new MyActor)'.
akka.actor.ActorInitializationException: exception during creation

Я наткнулся на это предыдущий вопрос, но принятый ответ в данном случае мне не помог.

Если это уместно, вот определение актера DoubleAuctionMarket...

class DoubleAuctionMarket(val security: Security, val ticker: Agent[Tick]) extends Actor with ActorLogging {
  this: MatchingEngine =>
  ...

person davidrpugh    schedule 10.03.2015    source источник
comment
Как определяется ваш DoubleAuctionMarket актер?   -  person vptheron    schedule 10.03.2015
comment
Я обновил вопрос, включив в него информацию об актере DoubleAuctionMarket.   -  person davidrpugh    schedule 10.03.2015
comment
Вы пробовали без миксина "на лету" BasicMatchingEngine? Я не вижу ничего плохого в вашем коде и использовании вами TestActorRef.   -  person vptheron    schedule 10.03.2015
comment
Извините, но я новичок в Scala и Akka. Что именно вы подразумеваете под без миксина «на лету»?   -  person davidrpugh    schedule 10.03.2015
comment
Такое ограничение ссылки на собственный тип (this:MatchingEngine =>) обычно зарезервировано для трейтов, чтобы убедиться, что они смешиваются только с определенными типами классов. Чего вы пытаетесь добиться с помощью этой настройки на DoubleAuctionMarket? Выполнение этого в классе вынуждает вас выполнять динамическое микширование во время создания экземпляра, и я думаю, что это корень вашей проблемы.   -  person cmbaxter    schedule 10.03.2015
comment
Я реализовал различные MatchingEngines для DoubleAuctionMarkets. Идея заключалась в том, чтобы упростить замену механизмов сопоставления «на лету», чтобы мне было легче сравнивать выходные данные моделей для различных механизмов сопоставления (и избегать создания нового класса DoubleAuctionMarket для каждого MatchingEngine.. До сих пор я думал, что это элегантное использование самонабора...   -  person davidrpugh    schedule 10.03.2015
comment
new DoubleAuctionMarket(google, ticker) with BasicMatchingEngine это миксин. Как отметил @cmbaxter, я думаю, что ограничение самонабора в вашем актере является проблемой.   -  person vptheron    schedule 10.03.2015


Ответы (1)


У меня была та же проблема, потому что я использовал объект-компаньон для внедрения конфигурации в MyActor, не передавая его явно:

object MyActor {
  def apply(): MyActor = new MyActor(MyActorConfig.default)
  val props = Props(new MyActor(MyActorConfig.default))
}

Тогда я могу просто сделать:

val myActorRef = system.actorOf(MyActor.props, "actorName")

Ошибка связана с явной передачей аргументов в тесте здесь:

TestActorRef(new DoubleAuctionMarket(google, ticker))

Я бы попытался удалить with BasicMatchingEngine, как сказал vptheron, использовать конструктор, не смешивая ничего другого. Попробуйте также с актером без аргументов, если этого недостаточно.

Это должно решить вашу проблему, так как нет проблем только с:

TestActorRef(new DoubleAuctionMarket(google, ticker))
person negative    schedule 29.04.2016