2016-08-16 36 views
-1

FileInputStreamを使用するメソッドにはJUnitと書いています。constructorでは、ファイル名だけが渡されます。このファイルはサーブレット要求の一部として作成され、このファイルはどこにも格納されません。既存のファイルを持たずにMockito/PowerMockitoを使ってMockito/PowerMockitoをモックする

MockFileInputStreamPowerMockitoを使用して、私に模擬ファイルオブジェクトを与えようとしています。残念ながらFileNotFoundExceptionが有効ですが、ファイルが存在しないためこのメソッドをテストする方法がわかりません。テスト中の

方法:これまで

public String viewReport() throws Exception { 
    this.inputStream = new FileInputStream(DOCUSIGN_REPORT_FILE); 

    try { 
     boolean returnReport = validateRequest(); 
     if (returnReport) { 
      intgList = this.generateViewIntegrationReportData(getESignUIConfig()); 
      this.createCSVFile(intgList, new FileWriter(DOCUSIGN_REPORT_FILE)); 
     } else { 
      failureResponse(msgs, 400); 
      return null; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     msgs.add(new Message(ESignatureIntegrationMessageTypeEnum.MESSAGE_TYPE_ERROR, 
        UiIntegrationKeyConstants.UI_INTEGRATION_ERROR_CODE_500, UiIntegrationKeyConstants.UI_INTEGRATION_ERROR_TEXT_SERVICE_ERROR)); 
     failureResponse(msgs, 500); 
     return null; 
    } 

    return UiIntegrationKeyConstants.REPORT_REPSONSE; 
} 

JUnitテスト。

@Test 
public void testViewReport() throws Exception { 
    Map<String, Object> actionMap = new HashMap<>(); 
    actionMap.put("application", "ESignatureIntegrationAction"); 

    ActionContext.setContext(new ActionContext(actionMap)); 

    FileInputStream inputStream = Mockito.mock(FileInputStream.class); 
    PowerMockito.whenNew(FileInputStream.class).withAnyArguments().thenReturn(inputStream); 

    action = new ESignatureIntegrationAction(); 
    action.viewReport(); 
} 

コードが助けをnew FileInputStream(DOCUSIGN_REPORT_FILE);

おかげに達したとき、私はexceptionを取得します。

+2

通常の注意点:(依存性注入と一緒に)工場を使用している場合、新しいものへの呼び出しを模擬するためにPowermockは必要ありません。 – GhostCat

+0

あなたはSpringを使ってFileInputStreamを注入すべきですか? – Jaykumar

+0

あなたのコードが何かを読むことができるファイルがない場合、あなたのテストは実際にテストしますか? –

答えて

0

私は、モックフレームワークなしでテストできるようにあなたのコードをリファクタリングすることをお勧めします。

なんだか、このようになります。IntegrationReportGeneratorは簡単にテスト可能になり

public class YourClass { 

    // ... 

    public String viewReport() { 
     try { 
      boolean isValidRequest = validateRequest(); 
      if (isValidRequest) { 
       IntegrationReportCsvFileHandler fileHandler = new IntegrationReportCsvFileHandler(); 
       IntegrationReportData inputData = fileHandler.readData(new FileInputStream(DOCUSIGN_REPORT_FILE)); 

       IntegrationReportGenerator generator = new IntegrationReportGenerator(); 
       IntegrationReportData outputData = generator.processData(inputData, getESignUIConfig()); 

       fileHandler.writeReport(outputData, new FileWriter(DOCUSIGN_REPORT_FILE)); 
      } else { 
       failureResponse(msgs, 400); 
       return UiIntegrationKeyConstants.FAILURE_RESPONSE; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      msgs.add(new Message(ESignatureIntegrationMessageTypeEnum.MESSAGE_TYPE_ERROR, 
         UiIntegrationKeyConstants.UI_INTEGRATION_ERROR_CODE_500, UiIntegrationKeyConstants.UI_INTEGRATION_ERROR_TEXT_SERVICE_ERROR)); 
      failureResponse(msgs, 500); 
      return UiIntegrationKeyConstants.FAILURE_RESPONSE; 
     } 

     return UiIntegrationKeyConstants.REPORT_RESPONSE; 
    } 

    // ... 

} 

public class IntegrationReportData { 
    // your custom data structure 
    // may as well just be a List<Data> 
    // may be different for input and output 
} 

public class IntegrationReportException extends Exception { 
    // your custom exception 
    public IntegrationReportException(String message) { super(exception); } 
} 

public class IntegrationReportGenerator { 

    public IntegrationReportData processData(IntegrationReportData data, ESignConfig config) throws IntegrationReportException { 
     // here's your logic that requires testing 
    } 

} 

public class IntegrationReportCsvFileHandler { 

    public IntegrationReportData readData(InputStream input) throws IOException { 
     // read data from given input stream 
    } 

    public void writeData(IntegrationReportData data, OutputStreamWriter outputWriter) throws IOException { 
     // write data to given output stream 
    } 

} 

その方法。

関連する問題