2017-01-05 3 views
1

私はこのような方法があります:テストvoidメソッドをどのようにユニット化しますか?

public void processEvent(Event e) { 
    save(e); 
    if (e != "foo") { 
     broadcast(e); 
    } 
} 

どのようにユニットテストこの変更をするには:私は放送したくない特定のイベントをフィルタリングするために、それを変更しかし

public void processEvent(Event e) { 
    save(e); // void method 
    broadcast(e); // void method. 
} 

を?

+3

'Mockito'などのようなMocking Frameworkを使用している場合は、' save() 'と' broadcast() 'メソッドが呼び出された時刻を確認することができます。 – user2004685

+1

メソッドの副作用をチェックする必要があります: 'save'と' broadcast'は何を検出できますか? –

+0

条件をテストすることを意味する場合は、それを意味のある名前付き関数に抽出し、その関数をテストします。だからif(isNotFoo(e))か何か – aw04

答えて

1

私が正しく理解していれば、あなたのメソッドは特定のイベントのみをブロードキャストするべきです。

特定のメソッド(ブロードキャスト)が何回実行されたかを確認できます。

私はモックフレームワークとしてMockitoを使用している

とそれにそれが次のようになります。また

MyEvent myEvent = mock(myEvent.class); 

をあなたがしたい場合は:あなたは、事前に個別のイベントを模擬する必要があります

Mockito.verify(myEvent, times(1)).proccessEvent(); 

ブロードキャストが実行されていないかどうかを確認してください。私はお勧めします:

Mockito.verify(MyEvent, times(0)).proccessEvent(); 
+0

これは近いです。あなたのインスタンス( 'myEvent'ではなく、' MyEvent')を 'verify'にpasして、実際のprocessEventメソッドを呼び出すか、何も呼び出されないようにしたいでしょう。 – Adam

+0

また、Mockitoには 'times(0)'の代わりに使用できるstatic import 'never()'があります。 – nickb

+0

@RunWith(MockitoJUnitRunner)を忘れないでください。クラス)をユニットテストの先頭に追加し、もう1つのヒントは@Mockアノテーションを使用してオブジェクトをもっと早くモックすることです –

2

UnitTests verify 公に観察可能な行動 "コード"ではありません。

したがって、 "テスト中のクラス"(切り取り)とその依存関係の相互作用を確認する必要があります。つまり、あなたのカットが依存関係についての期待されたメソッドを呼び出すかどうかをチェックします(そうでない場合)。

この依存関係の1つは、Eventオブジェクトです。

ほとんどの場合、方法save()broadcast()は他の依存関係(他のクラスのオブジェクト)とやりとりします。

関連するすべての依存関係のモックを作成します。 模造フレームワーク(Mockito、JMockなど)を使用してください。

テスト実行時に実際のオブジェクトをモックと交換できる場所である「シーム」を作成するために、クラスを改善する必要があるかもしれません。これは依存性注入によって最もよく行われます。

次に、依存関係を想定どおりに切断したことを確認できます。

関連する問題