2016-05-02 24 views
3

私は、コードのこの部分で反射の非常に限られたセットを使用しています:テスト反射のnewInstance例外

public NetworkClient createNetworkClient() { 
    try { 
     return (NetworkClient) getNetworkClientClass().getConstructors()[0].newInstance(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

にはどうすればnewInstance()スローInvocationTargetException(およびその他のこと(ユニットテストを使用して)テストすることができます例外)?

私は現在、UTの残りの部分でMockitoとHamcrestを使用しています。

+0

を私はあなたが求めているものを得ることはありません。どのようにそれをテストしたいですか?自動? – Seth

+0

ユニットテスト付き@Seth –

答えて

1

あなたのjunitテストのどこかで、NetworkClientクラスのインスタンスを作成しています。これは、setUp()メソッド(junt 3)または@Beforeメソッド(junit 4)のいずれかになければなりません。つまりWhereever、

classToTest = spy(new NetworkClient()); 

あなたはNetworkClientデフォルトコンストラクタを使用している場合は、ちょうど@Spyアノテーションでフィールドを宣言スパイ()でインスタンスをラップし、Mockitoはスパイとしてあなたのためにそれを作成します。

@Spy private NetworkClient classToTest;

@BeforeまたはsetUpメソッドでMockitoAnnotations.initMocks(this);を呼び出して、注釈が機能するようにしてください。

フィールドがスパイの場合、 getConstructors()クラスを模擬してテスト配列を返し、最初のコンストラクタで目的の例外をスローすることができます。

public class MyTest { 
    public static class MyFailingNetworkClient extends NetworkClient { 
     public MyFailingNetworkClient() { 
      throw new RuntimeException("Cannot create this object"); 
     } 
    } 
    ... 
} 

次に、あなたのテストケースでは、あなたはMokitoを使用することができます。

1

最も簡単な方法は、次のようにコンストラクタでExceptionをスローしますあなたのテストクラスでNetworkClientを拡張し、静的な入れ子になったクラスを作成することができますgetNetworkClientClass()リターンMyFailingNetworkClient.class(それは、単純なセッターで行うことができないと仮定して)次のよう作るために:

MyObject object = spy(new MyObject()); 
when(object.getNetworkClientClass()).thenReturn(
    MyFailingNetworkClient.class 
);