2017-09-29 2 views
0

Tout d'abord, je ne demande pas comment tester un Akka Acteur. Je connais les techniques pour le faire. Mon problème est légèrement différent.Composants de test unitaire qui utilise un acteur Akka

Je développe un programme Scala, appelons le client, qui n'utilise pas Akka Actors. Cependant, le programme utilise une librairie, appelons le server, dont l'interface est implémentée à l'aide d'un Akka Actor.

Puis, à travers le demander modèle, le client interagit avec le server.

// This is the client program 
class Client(uri: String) { 
    implicit val context: ActorSystem = ActorSystem("client-actor-system") 
    private val mainActor = context.actorSelection(uri) 

    def connect: Future[SomeClass] = { 
    implicit val timeout: Timeout = Timeout(5 seconds) 
    (mainActor ? Connect()).mapTo[CreationResponse] 
    } 
} 

Maintenant, je veux écrire des tests unitaires pour Client classe. Les tests unitaires permettent de tester une classe isolément. Toute dépendance externe doit être ridiculisée.

Comment puis-je me moquer de la référence à mainActor à l'intérieur de la classe Client? Comment puis-je injecter dans le système d'acteur un acteur simulé pour mainActor?

Merci d'avance.

Répondre

2

Je voudrais injecter la sélection d'acteur mainActor dans le client, et créer cela en utilisant Akka TestKits.

Bien sûr, vous avez besoin d'un ActorSelection, pas d'un ActorRef. Certaines solutions pour que l'on retrouve ici:

Giving an ActorPath for a testProbe

Ou bien, vous pouvez faire un mainActorActorRef en envoyant un message à l'IdentifyActorSelection.

+0

Je suppose que votre approche est la bonne et une seule. La seule chose que je n'aime pas c'est que l'utilisation d'Akka n'est plus cachée dans la classe 'Client'. –

+0

une alternative est de créer une méthode d'usine qui construit votre acteur, et dans le test, vous l'écrasez pour retourner 'probe.ref' –