8

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

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

ターゲット メソッドは次のようになります。

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

Spock はメソッドでモックを作成すると思いました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 との何らかの非互換性はありますか? そのようなクラスのモックを作成する方法はありますか?

4

2 に答える 2

19

ActorRef をモックするためにサポートされている唯一の方法は、TestProbe を作成することです。

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

これほど簡単でシンプルなことはありません。

于 2012-06-04T05:48:34.593 に答える
2

specs2 では、次のことができます。

val mockedActorRef = spy(TestProbe().ref)

その後、通常どおり使用してください。

于 2015-10-02T01:09:57.737 に答える