2017-01-17 3 views
0

Je réalise des tests unitaires pour mon projet Akka. Pour éviter InvalidActorNameException s et autres, je veux que tous les acteurs qui ont été créés dans un test unitaire soient arrêtés avant le prochain test unitaire. Donc, pour chaque acteur créé dans un test unitaire, j'appelle _system.stop(someActorRef) à la fin de celui-ci. Cependant, il faut un certain temps pour que l'acteur soit réellement arrêté, et malheureusement, le test d'unité suivant commence habituellement avant que les acteurs qui ont été créés dans le précédent soient effectivement partis. Et puisqu'il n'y a aucun Future qui est retourné par la méthode stop, ni une méthode awaitStop disponible, je ne sais vraiment pas comment résoudre ceci. Actuellement, j'appelle le Thread.sleep(1000) à la fin de chaque test unitaire et j'espère que tous les acteurs seront morts d'ici là, mais, évidemment, je ne peux pas rester ainsi. : DComment arrêter tous les acteurs et attendre qu'ils se terminent?

J'apprécierais n'importe quel indice!

Répondre

1

Vous pouvez essayer ceci à la fin de votre test:

val probe = TestProbe() 
probe.watch(someActorRef) 
system.stop(someActorRef) 
probe.expectMsgType[Terminated] 
//another way 
//probe.expectMsgPF() { 
// case Terminated(someActorRef) => 
//} 
+0

Cela semble cependant très intéressant, il ne compile pas: – lambdarookie

+0

'' 'liste' argument manquant pour méthode apply dans l'objet Terminated [ error] Les méthodes non appliquées sont uniquement converties en fonctions lorsqu'un type de fonction est attendu. [error] Vous pouvez rendre cette conversion explicite en écrivant 'apply _' ou' apply (_) (_, _) 'au lieu de' apply'. [erreur] probe.expectMsg (Terminé (someActorRef)) '' '' – lambdarookie

+0

J'ai mis à jour ma réponse – kardapoltsev