2016-06-26 6 views
0

У меня есть следующий код актер:Как проверить состав фьючерсов внутри метода приема актера?

class MyActor @Inject()(dao1: MyDao, dao2: OtherDao, eventBus: EventBus) extends Actor with ActorLogging { 

    import context.dispatcher 
    eventBus.subscribe(context.self, MyTopics.FooTopic) 

    override def receive: Receive = { 
    case Foo(name: String) => { 
     dao.get(name) 
      .flatMap(result => dao2.getSomeMoreStuff(result) 
       .flatMap(data => //do more stuff) 
     ) 
    } 
    } 
} 

Когда финишная актер обработать Foo, он будет ссылаться на эту будущую композицию, и будет двигаться, чтобы обработать еще одно сообщение Foo, до этого композиция закончена, которая хорошо (Я думаю).

Моя проблема тестирует этот актер:

class MyActorTest(_system: ActorSystem) extends TestKit(_system) 
with WordSpecLike with Matchers with BeforeAndAfterAll 
with MockitoSugar with DefaultTimeout with ImplicitSender{ 

    def this() = this(ActorSystem("myActorSpec")) 

    override def afterAll { 
    TestKit.shutdownActorSystem(system) 
    } 

    trait MyActorScope extends Scope { 
    val myDao = mock[MyDao] 
    val otherDao = mock[OtherDao] 
    val eventBus = new MyEventBus() 
    val myActor = TestActorRef(new MyActor(myDao, otherDao, eventBus) 
    } 

    "Test" must { 
    "verify dao" in new MyActorScope { 
     when(myDao.get(any)).thenReturn(Future.successful(("myDaoResult"))) 
     when(otherDao.getSomeMoreStuff(any)).thenReturn(Future.successful(("otherDaoResult"))) 
     eventBus.publish(new FooMessage(FooPayload("foo"))) 
     verify(myDao).get(any) 
     verify(otherDao).getSomeMoreStuff(any) 
    } 
    } 
} 

Так что здесь происходит, является то, что myDao проверяется успешно, но с другой Dao нет. Я думаю, это потому, что состав фьючерсов не был до конца обработки этого сообщения.

Любой способ справиться с этим? Имеет смысл код актера?

Спасибо!

+0

Я думаю, что вы можете использовать AKKA awaitAssert в этом случае? – C4stor

+0

@ C4stor, спасибо! На что? Я активирую код актера через публикацию сообщения. – Tomer

ответ

0

Fixed его с помощью тайм-аута VerificationMode

"Test" must { 
    "verify dao" in new MyActorScope { 
     when(myDao.get(any)).thenReturn(Future.successful(("myDaoResult"))) 
     when(otherDao.getSomeMoreStuff(any)).thenReturn(Future.successful(("otherDaoResult"))) 
     eventBus.publish(new FooMessage(FooPayload("foo"))) 
     verify(myDao, new Timeout(500, times(1))).get(any) 
     verify(otherDao, new Timeout(500, times(1))).getSomeMoreStuff(any) 
    } 
    }