使用 Mockito 的模拟文件、文件读取器和缓冲读取器类



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

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 读取。

但是,在执行此操作时,它在尝试实例化新的FileReader(f(部分时失败为NullPointerException。

那么是因为我不能嘲笑BufferedReader还是方法错误?

谢谢

您可以提取一个用于执行实际读取的方法,然后对其进行测试。这意味着你只需要嘲笑一个读者。例如,您的代码如下所示:

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

您可以尝试 PowerMock 注释。检查这个 : https://code.google.com/p/powermock/wiki/MockConstructor

相关内容

  • 没有找到相关文章

最新更新