2016-06-16 32 views
1

私は通常、Expectationsを使用して、異なる戻り値で値をモックすることを理解しています。たとえば:結果ブロックのExpectationsブロックは、検証ブロックと同じものですか?

new Expectations() {{ 
    bar.getGreeting(); 
    result = "Hello, world!"; 
    times = 2; 
}}; 

私は気づいたが、resultはオプションです。この時点で、このブロックはメソッドが2回呼び出されたことを確認し、そうでない場合はMissingInvocationエラーをスローします。例えばので:

@Test 
public void testRunFoo(@Mocked final Bar bar) { 
    Foo foo = new Foo(bar); 
    new Expectations() {{ 
     bar.runBar(); 
     times = 2; 
    }}; 

    foo.runFooWithBarTwice(); //Successful 
    //foo.runFooWithoutBar(); //Will throw a MissingInvocationException 
} 

私はこのコードではなくVerificationsを使用するのと同じもののように見えることに気づいた:

@Test 
public void testRunFoo(@Mocked final Bar bar) { 
    Foo foo = new Foo(bar); 

    foo.runFooWithBarTwice(); //Successful 
    //foo.runFooWithoutBar(); //Will throw a MissingInvocationException 

    new Verifications() {{ 
     bar.runBar(); 
     times = 2; 
    }}; 
} 

Verificationsブロックと同じものでは結果なしExpectationsブロックですか?あなたの好みに合わせてどちらかを使用できますか?それとも私が紛失している2つの微妙な違いがありますか?

答えて

3

どちらも同じように動作することは間違いありません。 Expectationsブロック内の相互作用を模擬すると、Verificationsブロックに配置するのと同様に検証されます。

あなたはhttp://jmockit.org/gettingStarted.htmlで紹介ページにJMockitのデザイン哲学を見れば、それは、Recordフェーズの目的は、テスト対象のコードを検証することはなく、次のパターン

@Test 
public void aTestMethod(<any number of mock parameters>) 
{ 
    // Record phase: expectations on mocks are recorded; empty if nothing to record. 

    // Replay phase: invocations on mocks are "replayed"; code under test is exercised. 

    // Verify phase: expectations on mocks are verified; empty if nothing to verify. 
} 

でテストを書く推奨していますテストするコードに依存関係と相互作用があることを確認するために、テストを実行する必要があります。したがって、Expectationsブロックの目的は、モックオブジェクトがReplayフェーズでテスト対象のコードと対話するために何か特別な処理を行う必要があるすべてのやりとりを記録することです。これは、通常、特定の値を返すこと、または正しいモックされたオブジェクトが相互作用に使用されることを保証することを意味します。

上記のJMockitドキュメントの3つのコメントを私の単体テストに入れてテストの文書化を助けることがあります。

最後に、Verificationsブロックでは、通常、模擬オブジェクトのやり取りの検証を行います。 Verificationsブロックの前、後、または内に、標準のJunitアサーションを使用することもできます。

関連する問題