使用Mockito/PowerMockito模拟FileInputStream,而不需要现有的文件



我正在为使用FileInputStream的方法编写JUnit,并且在constructor中仅传递文件名。该文件是作为servlet请求的一部分创建的,并且该文件不存储在任何地方。

我试图Mock FileInputStream使用PowerMockito,使它给我一个模拟文件对象。不幸的是,我得到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();
}

我得到一个exception当代码达到new FileInputStream(DOCUSIGN_REPORT_FILE);

谢谢你的帮助

我建议重构您的代码,以允许在没有mock框架的情况下进行测试。

它可能看起来像这样:

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
    }
}

这样IntegrationReportGenerator就很容易测试了。

相关内容

  • 没有找到相关文章

最新更新