5

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

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

但没有成功:(

4

3 回答 3

9

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

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

于 2012-09-26T14:42:14.310 回答
2

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

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

于 2012-09-26T14:41:39.520 回答
1

我推荐的方法是有一个额外的类来处理BufferedReader. 这个类只有一个方法,里面没有实际的逻辑,所以它不需要任何单元测试。

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

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

您的课程更具可测试性;因为现在,您可以编写一个测试BufferedReaderFactory,在调用someMethod(). 在那个模拟上,你可以存根makeBufferedReader方法来抛出你想要的异常。

如果您希望我更详细地了解上述任何步骤,请添加评论。您可能还想阅读我在 Mockito wiki 上关于模拟对象创建的帖子;这与此密切相关。

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

于 2012-09-26T20:44:54.557 回答