使用Mockito模拟File、FileReader和BufferedReader类

10

我在一个方法中得到了下面的代码,我想要测试它

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();
    }

基本上我需要将文件中的“line1”,“line2”和“line3”作为行通过模拟的BufferedReader读取。

然而,在执行这个操作时,它会在尝试实例化new FileReader(f)部分时失败并抛出NullPointerException异常。

那么是因为我不能模拟BufferedReader还是我的方法有问题?

谢谢。

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

11
同意重新编写测试,但此时您甚至不需要模拟 BufferedReader;您可以直接跳到 new BufferedReader(new StringReader("line1\nline2\nline3")) - Jeff Bowman

0

我正在使用PowerMockito,但是PowerMock对我不可用。因此,任何与PowerMockito相关的答案都将非常有用。 - user2654241
请查看此链接:https://dev59.com/G2sz5IYBdhLWcg3w_NED - Sai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接