5

IOException以下に示すような入力ストリームを読み取るメソッドに、usingMockitoをスローする必要があります。それを行う方法はありますか?

public void someMethod(){
 try{
  BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
  firstLine = in.readLine();
 }catch(IOException ioException){
  //Do something
 }

私はのように嘲笑してみました

  BufferedReader buffReader = Mockito.mock(BufferedReader.class);
  Mockito.doThrow(new IOException()).when(buffReader).readLine();

しかしうまくいきませんでした:(

4

3 に答える 3

9

BufferedReaderをモックしていますが、メソッドはモックを使用していません。独自の新しいBufferedReaderを使用します。モックをメソッドに注入できる必要があります。

inputStreamこのメソッドを含むクラスのフィールドのようです。read()したがって、代わりにinputStreamをモックして、そのメソッドが(InputStreamReaderによって)呼び出されたときにIOExceptionをスローするようにすることができます。

于 2012-09-26T14:42:14.310 に答える
2

BufferedReaderメソッド内で作成されているため、ここで モックすることはできません。

代わりに、モックを作成inputStreamして例外をスローしてみてください。InputStream.read()

于 2012-09-26T14:41:39.520 に答える
1

私がお勧めする方法は、の作成を管理する追加のクラスを用意することBufferedReaderです。このクラスにはメソッドが1つだけあり、実際のロジックは含まれていないため、単体テストは必要ありません。

public class BufferedReaderFactory{
  public BufferedReader makeBufferedReader(InputStream input) throws IOException{
    return new BufferedReader(new InputStreamReader(input));
  }
}

次に、テストしているクラスにタイプのプライベートフィールドを追加し、BufferedReaderFactoryそれを注入する手段(setterメソッドまたは代替コンストラクター)を追加します。クラスの標準コンストラクターで、をインスタンス化し、BufferedReaderFactoryそれに応じてフィールドを設定します。で、を使用する代わりに、フィールドでメソッドをsomeMethod()呼び出します。makeBufferedReader()new

あなたのクラスははるかにテスト可能です。BufferedReaderFactoryこれで、を呼び出す前に、テストしているオブジェクトにモックを挿入するテストを作成できるようになりましたsomeMethod()。そのモックでは、makeBufferedReaderメソッドをスタブして、必要な例外をスローできます。

上記の手順のいずれかについて詳しく説明したい場合は、コメントを追加してください。また、Mockitowikiのモックオブジェクト作成に関する私の投稿を読むこともできます。これはこれと密接に関連しています。

しかし、最も重要なメッセージは、クラスをテスト可能にすることが非常に重要であり、何度も実行することのメリットを享受できるということです。

于 2012-09-26T20:44:54.557 に答える