2016-08-16 2 views
-1

Ich schreibe eine JUnit für eine Methode, die FileInputStream verwendet und in der constructor nur der Dateiname übergeben wird. Die Datei wird als Teil einer Servlet-Anforderung erstellt und diese Datei wird nirgendwo gespeichert.Mock FileInputStream mit Mockito/PowerMockito ohne eine vorhandene Datei

Ich versuche MockFileInputStream mit PowerMockito, so dass es mir ein verspottetes Dateiobjekt gibt. Leider bekomme ich FileNotFoundException das ist gültig, aber ich bin mir nicht sicher, wie man diese Methode dann testet, weil die Datei nicht existiert.

Methode im Test:

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 so weit.

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

Ich erhalte eine exception, wenn der Code zu new FileInputStream(DOCUSIGN_REPORT_FILE); für die Hilfe

Dank erreicht.

+2

Der übliche Vorbehalt: Wenn Sie eine Fabrik (zusammen mit Abhängigkeitsinjektion) verwenden würden ... dann würden Sie Powermock nicht brauchen, um einen Anruf zu neuem zu verspotten. – GhostCat

+0

Sie meinen, ich sollte FileInputStream mit Spring injizieren? – Jaykumar

+0

Was würde Ihr Test tatsächlich testen, wenn es keine Datei gibt, aus der Ihr Code etwas lesen kann? –

Antwort

0

Ich würde vorschlagen, Ihren Code in einer Weise zu refactorieren, die das Testen ohne ein spöttisches Rahmenwerk erlaubt.

Es könnte aussehen etwas wie folgt aus:

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 
    } 

} 

diese Weise die IntegrationReportGenerator leicht prüfbar sein würde.

Verwandte Themen