2015-03-10 5 views
0

Как создать 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 

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

В случае необходимости, здесь определение DoubleAuctionMarket актера ...

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

Как ваш 'DoubleAuctionMarket' актер определено? – vptheron

+0

Я обновил вопрос, чтобы включить информацию о актере DoubleAuctionMarket. – davidrpugh

+0

Вы пробовали без «на лету» mixin 'BasicMatchingEngine'? Я не вижу ничего плохого в вашем коде и использовании 'TestActorRef'. – vptheron

ответ

0

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

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

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

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

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

TestActorRef(new DoubleAuctionMarket(google, ticker)) 

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

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

TestActorRef(new DoubleAuctionMarket(google, ticker))