【问题标题】:how to throw IOException while reading a file using Mockito?使用 Mockito 读取文件时如何抛出 IOException?
【发布时间】:2012-09-26 14:37:07
【问题描述】:

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

但没有成功:(

【问题讨论】:

    标签: java unit-testing mocking mockito


    【解决方案1】:

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

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

    【讨论】:

    • 我还要补充一点,你可以通过做类似的事情来实现这一点:InputStream fileContents = spy(new ByteArrayInputStream(FILE_CONTENTS)); doThrow(new IOException()).when(fileContents).read(any(byte[].class));
    【解决方案2】:

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

    尝试模拟 inputStream 并从 InputStream.read() 抛出异常。

    【讨论】:

      【解决方案3】:

      我推荐的方法是有一个额外的类来处理 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 wiki 上阅读我在 mocking object creation 上的帖子;与此密切相关。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-14
        • 2012-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-09
        相关资源
        最近更新 更多