9

テストしたいメソッドで以下のコードを取得しました

File f = map.get("key1")
BuffereReader r = new BufferedReader(new FileReader(f));
String line=null;
do {
    line=r.readLine();
} while(r!=null);

JUnit テスト ケースからファイルの内容を渡すことができるように、この操作をモックしたいと考えています。私は以下を行いました:

Map fles = Mockito.mock(ConcurrentHashMap.class);
File file = Mockito.mock(File.class);
Mockito.when(files.get("key1")).thenReturn(file);

FileReader fileReader = Mockito.mock(FileReader.class);
BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);

try {
     PowerMockito.whenNew(FileReader.class).withArguments(file).thenReturn(fileReader);
     PowerMockito.whenNew(BufferedReader.class).withArguments(fileReader).thenReturn(bufferedReader);
     PowerMockito.when(bufferedReader.readLine()).thenReturn("line1")
         .thenReturn("line2").thenReturn("line3");

    } catch (Exception e) {
        Assert.fail();
    }

したがって、基本的には、モックされた BufferedReader によって読み取られるファイルからの行として、「line1」、「line2」、および「line3」を渡す必要があります。

ただし、それを行うと、新しい FileReader(f) 部分をインスタンス化しようとすると NullPointerException として失敗します。

BufferedReader をモックできないか、アプローチが間違っているためですか?

ありがとう

4

2 に答える 2

14

実際の読み取りを行うためのメソッドを抽出し、代わりにそれをテストできます。つまり、単一のリーダーをモックするだけで済みます。たとえば、コードは次のようになります。

public void aMethod(){
    File f = map.get("key1")
    BuffereReader r = new BufferedReader(new FileReader(f));
    readStuff(r);
}

public void readStuff(BufferedReader r){
    String line=null;
    do {
        line=r.readLine();
    } while(r!=null);
}

その場合、テスト コードは次のようになります。

BufferedReader bufferedReader = Mockito.mock(BufferedReader.class);
Mockito.when(bufferedReader.readLine()).thenReturn("line1", "line2", "line3");
objUnderTest.readStuff(bufferedReader);
//verify result
于 2013-09-24T12:32:33.077 に答える
0

PowerMock アノテーションを試すことができます。これを確認してください: https://code.google.com/p/powermock/wiki/MockConstructor

于 2013-09-24T09:07:33.190 に答える