我必须使用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维基上关于嘲讽对象创建的帖子;这与此密切相关。
但最重要的信息是,让你的类可测试真的很重要,你会从多次测试中获益。