我必须使用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();
但没有成功:(
答案 0 :(得分:7)
你正在嘲笑BufferedReader,但你的方法不使用你的模拟。它使用自己的新BufferedReader。您需要能够将模拟注入到方法中。
inputStream
似乎是包含此方法的类的字段。因此,您可以模拟inputStream,并在调用其read()
方法时(通过InputStreamReader)使其抛出IOException。
答案 1 :(得分:2)
你不能在这里模拟BufferedReader
,因为它是在方法中创建的。
尝试模仿inputStream
并从InputStream.read()
中抛出异常。
答案 2 :(得分:1)
我建议的方法是有一个额外的类来管理BufferedReader
的创建。这个类只有一个方法,没有实际的逻辑,所以它不需要任何单元测试。
public class BufferedReaderFactory{
public BufferedReader makeBufferedReader(InputStream input) throws IOException{
return new BufferedReader(new InputStreamReader(input));
}
}
现在,将类型BufferedReaderFactory
的私有字段添加到您正在测试的类中,以及注入它的方法 - setter方法或备用构造函数。在类的标准构造函数中,实例化BufferedReaderFactory
并相应地设置字段。在someMethod()
中,在字段上调用makeBufferedReader()
方法,而不是使用new
。
你的课程更可测试;因为现在,您可以在调用BufferedReaderFactory
之前编写一个测试,将测试的someMethod()
注入您正在测试的对象。在那个模拟器上,你可以存根makeBufferedReader
方法来抛出你想要的异常。
如果您希望我详细了解上述任何步骤,请添加评论。您可能还想阅读Mockito wiki上mocking object creation上的帖子;这与此密切相关。
但最重要的信息是,让你的课程可测试是非常重要的,你将获得多次这样做的好处。