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

时间:2012-09-26 14:37:08

标签: java unit-testing mocking mockito

我必须使用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();

但没有成功:(

3 个答案:

答案 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上的帖子;这与此密切相关。

但最重要的信息是,让你的课程可测试是非常重要的,你将获得多次这样做的好处。