2017-09-21 6 views
0

私は、俳優のpreStart()の間に起こる何かにアサーションをする必要があるテストを持っていますが、それが起こるまで待つ方法を理解していないし、アサーションが作成される前にします)。私はこの試みている:テスト中にアクカの俳優を待つ方法は?

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

を、それを使用したとき、私は、エラーメッセージが表示されます。

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" 
    } 
} 

実行:

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

「やっと」試しましたか? (http://doc.scalatest.org/1.8/org/scalatest/concurrent/Eventually.html) – amorfis

+0

@amorfis私はScalatestを使用していません。 –

答えて

2

あなたはinterceptブロック内の俳優の作成を置くことができます上記のコードは次の出力を生成します:

[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 

インターセプトは、アクターのpreStartフック内のデバッグ文を「キャッチ」します。

+0

'intercept'の使用は、' akka.actor.debug.lifecycle = on'の場合にのみ有効です。これは私が期待していたものです - 私はすでにそのすべてを持っていましたが、あなたのコードはそれがなくても動作します(私はそれをテストしていません)。 –

+0

@ DanielC.Sobral: 'akka.actor.debug.lifecycle = on'を設定することは私には起こりませんでした。私のコードは、 'preStart()'の中に 'log.debug(" MyActor ... ")'文があるので、その設定なしで動作します。 – chunjef

関連する問題