簡體   English   中英

如何在使用Mockito讀取文件時拋出IOException?

[英]how to throw IOException while reading a file using 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();

但沒有成功:(

你在嘲笑BufferedReader,但你的方法不使用你的模擬。 它使用自己的新BufferedReader。 您需要能夠將模擬注入到方法中。

看起來inputStream是包含此方法的類的字段。 所以你可以改為模擬inputStream,並在調用read()方法(由InputStreamReader)時拋出一個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()之前將someMethod() BufferedReaderFactory注入您正在測試的對象。 在那個makeBufferedReader ,你可以存根makeBufferedReader方法來拋出你想要的異常。

如果您希望我詳細了解上述任何步驟,請添加評論。 您可能還想在Mockito wiki上閱讀關於模擬對象創建的帖子; 這與此密切相關。

但最重要的信息是,讓你的課程可測試是非常重要的,你將獲得這么多次這樣做的好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM