我在我想测试的方法中得到了下面的代码
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 还是方法错误?
Thanks
您可以提取一种进行实际读取的方法,然后对其进行测试。这意味着你只需要嘲笑一个读者。例如,您的代码将是这样的:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)