Ich habe folgende Schauspieler Code:Wie testet man die Zusammensetzung von Futures innerhalb einer Empfangsmethode des Schauspielers?
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)
)
}
}
}
Wenn der Schauspieler Finish Foo zu verarbeiten, wird es diese künftige Zusammensetzung berufen, und bewegt sich eine andere Foo Nachricht zu verarbeiten, bevor diese Zusammensetzung beendet ist, was in Ordnung ist (Ich denke).
Mein Problem testet diesen Schauspieler:
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)
}
}
}
Also, was hier passiert, ist, dass myDao erfolgreich verifiziert wird, aber die andere Dao ist es nicht. Ich denke es liegt daran, dass die Zusammensetzung der Futures nicht vor dem Ende dieser Nachrichtenverarbeitung passiert ist.
Jeder Weg, damit umzugehen? Macht der Schauspieler-Code Sinn?
Danke!
Ich glaube, Sie Akka awaitAssert in diesem Fall nicht verwenden kann? – C4stor
@ C4stor, danke! auf was? Ich aktiviere den Akteurcode über die Veröffentlichung einer Nachricht. – Tomer