如何在使用Mockito读取文件时抛出IOException



我必须使用Mockito为一个方法抛出一个IOException,该方法正在读取如下所示的输入流。有什么办法吗?

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

但没有成功:(

您正在模拟BufferedReader,但您的方法不使用mock。它使用自己的新BufferedReader。您需要能够将mock注入到方法中。

似乎inputStream是包含此方法的类的一个字段。因此,您可以模拟inputStream,并使其在(由InputStreamReader)调用其read()方法时抛出IOException。

这里不能模拟BufferedReader,因为它是在方法内部创建的。

试着嘲笑inputStream,然后从InputStream.read()抛出异常。

我建议使用一个额外的类来处理BufferedReader的创建。这个类只有一个方法,其中没有实际的逻辑,所以它不需要任何单元测试。

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

现在,向正在测试的类中添加一个类型为BufferedReaderFactory的私有字段,以及注入它的方法——setter方法或备用构造函数。在类的标准构造函数中,实例化一个BufferedReaderFactory并相应地设置字段。在someMethod()中,在字段上调用makeBufferedReader()方法,而不是使用new

你的课更容易测试;因为现在,您可以编写一个测试,在调用someMethod()之前,向正在测试的对象注入一个模拟的BufferedReaderFactory。在该mock上,您可以存根makeBufferedReader方法来抛出您想要的异常。

如果你想让我更详细地了解上面的任何一个步骤,请添加评论。你可能还想阅读我在Mockito维基上关于嘲讽对象创建的帖子;这与此密切相关。

但最重要的信息是,让你的类可测试真的很重要,你会从多次测试中获益。

相关内容

  • 没有找到相关文章

最新更新