2015-01-09 15 views
6

私は俳優のインスタンスを偵察したいと思いますが、新しいキーワードで単純に作成することはできません。私は以下の解決策を考え出しました:Akkaの俳優のmockitoとのスパイ

val testActorSpy = spy(TestActorRef(new TestActor).underlyingActor) 
    val testActorRef = TestActorRef(testActorSpy) 

しかし、私はこのようにして1つの不要なアクターを作成します。クリーナーソリューションはありますか?

答えて

0

私はAkka Actorシステムについて理解していますので、次にプロパティでこれを行う必要がありますか?

このように、Propsでアクタを作成し、テスト中にアクタにスパイを返すだけです。

val testActorRef = TestActorRef(spy(new TestActor)) 
val testActorSpy = testActorRef.underlyingActor 

は俳優の再起動時にunderlyingActorが破壊されることを注意してください:

は、このように、これはあなたに結果を与える必要があります。だからこれを嘲笑するのが最良の選択肢ではないかもしれない。

システムを経由せずに直接アクターを使用する場合は、スレッドの基礎となるシステムをバイパスしてテストすることもできます。

this(javaの場合は下にコードを貼り付けます)を参照してください。

static class MyActor extends UntypedActor { 
    public void onReceive(Object o) throws Exception { 
    if (o.equals("say42")) { 
     getSender().tell(42, getSelf()); 
    } else if (o instanceof Exception) { 
     throw (Exception) o; 
    } 
    } 
    public boolean testMe() { return true; } 
} 

@Test 
public void demonstrateTestActorRef() { 
    final Props props = Props.create(MyActor.class); 
    final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testA"); 
    final MyActor actor = ref.underlyingActor(); 
    assertTrue(actor.testMe()); 
} 
+0

俳優の唯一のパブリックメソッドは、 'onReceive'である必要があります。さもなければ、不変性は危険にさらされます。この場合、 'testMe'メソッドがアクターの状態を変更すると、その原則に違反します。 'testMe'はプライベートでなければなりません。 SpringでJUnitテストのプライベートメソッドにアクセスするには、 'ReflectionTestUtils'を使います。 –

+0

パッケージをプライベートにします。可視性を変更する方法はたくさんあります。私たちのコードベースで働く皆は、変更可能な共有状態が悪いことを認識しています。 ActorRefはパブリック関数を公開しません。だからそれは問題ではありません。私たちの競争条件は私的な状態を閉じることから来ています。 – Alex

+0

あなたは正しいです。アクター内の公開メソッドは公開されていません。私はちょうどそれがコードのにおいのような気分を持っています。しかし、機能的な観点からは、あなたは正しいです。 誰かが自分のメソッドを非公開にしたい場合、それらは 'ReflectionTestUtils'で呼び出すことができます。 –

関連する問題