2016-05-18 15 views
0

私のTestNGユニットテストでは、テストしたい場所に例外がスローされたシナリオがありますが、メソッドが呼び出されていないことをテストしたいモックされたサブコンポーネントで私はこの思い付いたが、これはよく読み、醜い長くはない:TestNG + Mockito、投げられた例外をテストしてモックを呼び出す方法

@Test 
public void testExceptionAndNoInteractionWithMethod() throws Exception { 

    when(subComponentMock.failingMethod()).thenThrow(RuntimeException.class); 

    try { 
     tested.someMethod(); //may call subComponentMock.methodThatShouldNotBeCalledWhenExceptionOccurs 
    } catch (RuntimeException e) { 
     verify(subComponentMock, never()).methodThatShouldNotBeCalledWhenExceptionOccurs(any()); 
     return; 
    } 

    fail("Expected exception was not thrown"); 
} 

両方の例外をテストし、()metodを確認するために、任意のより良い解決策はありますか?

+0

TestNGを使用する場合、予期しない例外に対しては、 'try catch'ブロックを使用する代わりに' @ Test'アノテーションの 'expectedExceptions'属性を使用する必要があります。 – Jagger

+0

しかし、その場合は、テストコードが決してそこに届くことはないので、verify()を使用することができません。 – Michal

+2

[Mockitoの重複している可能性があります。投げられた例外を模擬してアサートしますか?](http://stackoverflow.com/questions/ 16323580/mockito-how-to-mock-and-assert-a-thrown-exception) – krokodilko

答えて

1

2つのテストを作成し、注釈属性expectedExceptionsdependsOnMethodsを使用して、これらの2つの問題を区別します。

@Test(expectedExceptions = { RuntimeExpcetion.class }) 
public void testException() { 
    when(subComponentMock.failingMethod()).thenThrow(RuntimeException.class); 
    tested.someMethod(); //may call subComponentMock.methodThatShouldNotBeCalledWhenExceptionOccurs 
} 

@Test(dependsOnMethods = { "testException" }) 
public void testNoInteractionWithMethod() { 
    verify(subComponentMock, never()).methodThatShouldNotBeCalledWhenExceptionOccurs(any()); 
} 

私にとっては、それはもっと綺麗に見えます。 try catchブロックを取り除き、不要なfailメソッド呼び出しを取り除きます。

+1

この回答ありがとうございます。私たちのチームでは激しい議論が始まりました。 – Michal

+1

それで、私たちは最終的に私たちが探していたものを見つけました。このソリューションは、私たちが気に入らなかった、テスト間の依存関係をもたらします。私たちは、テストは独立しているべきだと考えています。私たちが選んだ解決策は私の答えです。 – Michal

1

アサーションフレームワークを使用することに決めました。

関連する問題