2012-06-03 9 views
7

クラスのSpockテストを作成しようとしましたが、ここでアクターにメッセージを送信することを確認する必要があります(たとえばstatActor)。私はAkkaが統合テストのための特別なライブラリを持っていることを知っていますが、それは非常に簡単なテストのためにあまりにも多いようです。だから、私は試してみた:私はスポックが法tellでモックを作成することを考えAkockのActorRef用のSpockモック

void startStats() { 
    Date x = null 
    // prepare some data, fill x with required value 
    this.statActor.tell(x) 
} 

setup: 
def myActor = Mock(ActorRef) 
myService.statActor = myActor 
when: 
myService.startStats() 
then: 
1 * myActor.tell(_) 

ターゲットメソッドは次のようになります。しかし、このテストを実行した後、私は取得しています:

java.lang.ClassCastException: akka.actor.ActorRef$$EnhancerByCGLIB$$80b97938 cannot be cast to akka.actor.ScalaActorRef 
    at akka.actor.ActorRef.tell(ActorRef.scala:95) 
    at com.example.MyService.startStats(MyService.groovy:32) 

を、それが本当のActorRef実装を呼び出しているのはなぜ? Scalaとのある種の非互換性?そのようなクラスのためのモックを作る方法はありますか? ActorRefを模擬する

+1

"非常に簡単なテストではあまりにも多いようです。" - 私はこの結論がどのように行われたか、特にあなたが試したモックがうまくいかなかったことを考えてもよいでしょうか? –

+0

@ViktorKlang 'def actor = Mock(ActorRef)'という行は 'testkit'に必要な行数がそれほど多くないからです。私はそれが他のオブジェクトのモックを作ることができることを意味し、細かく、実際に使用するのが簡単です。 –

+0

@paradigmaticはい、わかります。おそらく私は厳しい質問をしていますが、私はここで何ができますか? : –

答えて

16

ザ・唯一の方法は、TestProbeを作成することである:

// "system" is an ActorSystem 
final TestProbe probe = TestProbe.apply(system); 
final ActorRef mock = probe.ref; 

それがこれより簡単にまたは単純に取得していません。あなたが行うことができますspecs2で

+0

ありがとう。このアクタには '.tell()'が呼び出され、私も同様にテストできる値がありますか? –

+0

http://にリストされているプローブでのメッセージ受信をアサートする方法はたくさんあります/doc.akka.io/api/akka/2.0/akka/testkit/TestProbe.html – paradigmatic

+0

ああ、私はそれが 'TestActorRef'と同じだと確信していた –

0

val mockedActorRef = spy(TestProbe().ref) 

その後、通常通りに使用します。

関連する問題