web-dev-qa-db-ja.com

チェックされた例外はこのメソッドに対して無効です

私は以下のクラスを持っています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ブロックで文字列メッセージをテストする方法。

3
Sawyer

あなたはモックを間違えてユニットテストをしています。ここに:

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()」が実際に何をするのかわからないので、これ以上言うことはできません。

0
Heri