У меня есть следующий код актер:Как проверить состав фьючерсов внутри метода приема актера?
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 нет. Я думаю, это потому, что состав фьючерсов не был до конца обработки этого сообщения.
Любой способ справиться с этим? Имеет смысл код актера?
Спасибо!
Я думаю, что вы можете использовать AKKA awaitAssert в этом случае? – C4stor
@ C4stor, спасибо! На что? Я активирую код актера через публикацию сообщения. – Tomer