私は以下のクラスを持っていますStackOverflowにこれに対する答えがありますが、それはリストを扱います Mockitoでモックからチェックされた例外をスロー 。私はこの状態を調べるのが好きです。私が行方不明になった場所を取得できません。
public SimpleClass{
private SimpleClass(){}
public void runMethod(request,String,Map,Object,Object){
try{
doesSomething()....
}
}
catch(Exception e){
String message= ""+request.getAttribute(X)+"Some message"
Logger.Log(param1+param2+message);
}
}
私のTestメソッドは以下のようになります。 JUnitでカバレッジを実行しようとしましたが、Catchブロックはカバーされていないため、以下のテストメソッドを書きました。以下の例外が発生します。私が行方不明になった場所を取得できません。
public class SimpleClassTest{
@Test
public void testCatchBlock(){
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
Mockito.doThrow(new Exception()).when(instanceObj).runMethod(request, anyString(), anyMap(), anyObject(), anyObject());
}
}
例外がスローされました
org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: Java.lang.Exception
編集
NullPointerExceptionを指定してメソッドを実行できます。 Junitでコードカバレッジを試行すると、catchブロックは完全に赤で表示され、catch句は黄色で表示されます。 100%のカバレッジを達成する方法と、catchブロックで文字列メッセージをテストする方法。
あなたはモックを間違えてユニットテストをしています。ここに:
SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
テスト中のクラスのモックにnoポイントがあります!
そのクラスをmockすると、実際の実装では「何もしない」stubが得られます。 「作業設定」は次のようになります。
public void methodUnderTest(X x, ...) {
try {
x.foo();
} catch (Exception e) {
...
}
そして
X mockedX = mock(X.class);
when(x.foo()).thenThrow(new WhateverException());
underTest.methodUnderTest(mockedX); ...
そして、あなたはverifyを試すことができます。たとえば、ロガーがその予期されたロギング呼び出しを見つけたとします。言い換えると、モックを使用してテスト中のコードをallowして、その仕事を(youで制御できるように! )またはto verify予想される呼び出しがモックオブジェクトで行われたこと。
しかし、言ったように:テストしたいクラスをモックするのは意味がありません。モックされたオブジェクトは「実際の」実装について何も知らないからです!
「doesSomething()」が必要な例外をスローするように環境を操作します。 「doesSomething()」が実際に何をするのかわからないので、これ以上言うことはできません。