2016-10-08 16 views
3

私は従来のJavaコードの単体テストを書いています。今私は問題に遭遇しています。以下はclass Aのためのテストコードを書いています。例外処理コードをテストするためのテストコードはどのように記述しますか?

class A { 

    public A(){ 

    } 

    public void doSomething()throws DBException { 
     try{ 
      //some code that might throw JDBCConnectionException 
     }catch(JDBCConnectionException e){ 
      notifyJDBCConnection() 
     }catch(Exception e){ 

     } 
    } 

    private void notifyJDBCConnection(){ 
     //do notification stuff 
    } 
} 

は今、私はJDBCConnectionExceptionがキャッチされたときに実行されたnotifyJDBCConnection()方法かどうかをテストする必要がある場合を言います。この問題にアプローチする正しい方法は何ですか?または、私はちょうど方法をテストするためのテストを書く必要がありますnotifyJDBCConnectionは大丈夫ですか?

+0

なぜ 'notifyJDBCConnection'が公開されていますか?別のクラスから呼ばれていますか? – saka1029

+0

@ saka1029はい、私はあなたが正しいと思います。 'class A'からのみ呼び出され、' public'ではありません。 – kenshinji

+0

驚くほど受け入れてくれてありがとう;-) – GhostCat

答えて

0

一つ方法:

  1. あなたは、独自のクラスにその例外を処理の責任を置きます。
  2. 次に、依存性注入を使用して、この新しいクラスのオブジェクトをクラスAに提供します。
  3. 今、あなたは最後に、あなたがあなたの嘲笑オブジェクトが期待される通話を認識していることを確認A.
  4. にその例外ハンドラクラスの嘲笑インスタンスを渡すために、このようなEasyMockやMokitoとしてモックフレームワークを使用することができます。

このアプローチは、表面上では「より多くの仕事」のように見えるかもしれませんが、より良い設計につながる可能性があります。特別な例外ハンドラクラスを作成することで、そのクラスも独自にテストできます!

GhostCatによって提案されたデザインとMockitoとJUnitを使って
1

notifyJDBCConnectionは、電子メールの送信者またはそれ以外の場合、何らかの通知フレームワークを呼び出すと仮定します。 Mockitoのようなフレームワークを使用してそのコンポーネントをモックすると、そのコンポーネントへの適切な呼び出しが行われたことを確認できます。これを近づいての

+0

はい。つまり、例外処理部を含むtryブロックからcatchブロックへのロジックをカバーするテストコードを書く必要がないということですか?私がしなければならないのは、Mockitoを使って通知コンポーネントをテストすることだけです。 – kenshinji

+0

さて、通知メソッドを何とか呼び出すには、それを取得する必要があります。それはあなたも嘲笑することができるJDBCオブジェクトを呼び出しますか? –

+0

あなたは 'notifyJDBCConnection'を意味しますか?いいえ、それは他のコンポーネントにメッセージを送信するだけです。 – kenshinji

0

ソリューション:

class A { 
    private final JDBCConnectionNotifier notifier; 

    public A(JDBCConnectionNotifier notifier){ 
     this.notifier = notifier; 
    } 

    public void doSomething()throws DBException { 
     try{ 
      //some code that might throw JDBCConnectionException 
     }catch(JDBCConnectionException e){ 
      notifier.notifyJDBCConnection() 
     }catch(Exception e){ 

     } 
    } 
} 

だから、テストクラスウォールドがあること:

import static org.mockito.Mockito.*; 
import org.junit.*; 

class ATest { 
    @Test 
    public void shouldCallNotifierOnJDBCConnectionException() throws Exception { 
     JDBCConnectionNotifier notifier = mock(JDBCConnectionNotifier.class); 
     A a = new A(notifier); 

     a.doSomething(); 

     verify(notifier).notifyJDBCConnection(); 
    } 
} 
関連する問題