2017-09-21 1 views
0

J'ai un test qui doit faire une assertion sur quelque chose qui se passe pendant le preStart() d'un acteur, mais je n'ai pas compris comment attendre jusqu'à ce que cela arrive, et parfois cela n'arrive pas avant que l'assertion soit faite (et parfois Cela fait). Je l'ai essayé:Comment attendre que l'acteur Akka démarre pendant les tests?

EventFilter.debug(start = "started", occurrences = 1).assertDone(10.seconds) 

mais je reçois un message d'erreur lorsque vous l'utilisez:

java.lang.AssertionError: assertion failed: 1 messages outstanding on DebugFilter(None,Left(started),false) 
+0

Avez-vous essayé «finalement»? (http://doc.scalatest.org/1.8/org/scalatest/concurrent/Eventually.html) – amorfis

+0

@amorfis Je n'utilise pas Scalatest. –

Répondre

2

Vous pouvez placer la création de l'acteur dans un bloc intercept:

import akka.actor._ 
import akka.testkit.EventFilter 
import com.typesafe.config.ConfigFactory 

class MyActor extends Actor with ActorLogging { 
    override def preStart(): Unit = { 
    log.debug("started MyActor...") 
    } 

    def receive = { 
    case m => log.debug(s"Received this message: $m") 
    } 
} 

object MyActor { 
    def props() = Props[MyActor] 
} 

object EventFilterTest extends App { 
    implicit val system = ActorSystem("testsystem", ConfigFactory.parseString(""" 
    akka.loggers = ["akka.testkit.TestEventListener"] 
    akka.loglevel = "DEBUG" 
    """)) 

    EventFilter.debug(start = "started", occurrences = 1) intercept { 
    val myActor = system.actorOf(MyActor.props) 
    myActor ! "cows" 
    } 
} 

Course à pied le code ci-dessus produit la sortie suivante:

[DEBUG] [...] [run-main-0] [EventStream(akka://testsystem)] logger log1-TestEventListener started 
[DEBUG] [...] [run-main-0] [EventStream(akka://testsystem)] Default Loggers started 
[DEBUG] [...] [testsystem-akka.actor.default-dispatcher-5] [akka://testsystem/user/$a] Received this message: cows 

L'interception "attrape" l'instruction de débogage dans le crochet preStart de l'acteur.

+0

Utiliser 'intercept 'fonctionne, mais seulement si j'ai' akka.actor.debug.lifecycle = on'. Ce à quoi je m'attendais - j'avais déjà tout ça - mais c'est étrange que votre code fonctionne (je ne l'ai pas testé) sans cela. –

+0

@ DanielC.Sobral: Il ne m'est pas venu à l'esprit de mettre 'akka.actor.debug.lifecycle = on'. Mon code fonctionne sans ce paramètre car il existe une instruction 'log.debug (" a démarré MyActor ... ")' dans 'preStart()'. – chunjef