微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Apache SS Workbook 进行 Junit HTTP 请求测试?

如何解决使用 Apache SS Workbook 进行 Junit HTTP 请求测试?

我的 restful 服务接受一个文件参数,其内容一个 Apache SS (XSSF) 工作簿。该方法遍历工作簿的单元格并根据单元格的值执行各种操作。

我设计了一个 Junit 测试,我在其中实例化并填充 Apache SS 工作簿,将其添加到“文件”对象,然后将“文件”对象传递给被测方法。我遇到的主要问题是如何使用 Workbook 对象实例化“文件”对象。

以下是被测方法的示例(省略与工作簿无关的细节),然后是我尝试执行的伪代码示例:

/* Method under test */
public Object workbookProcessing(HttpServletRequest request) {
    List<Part> workbookParts = request.getParts().collect(Collectors.toList());
    for (Part workbookPart : workbookParts) {
        InputStream workbookContent = workbookPart.getInputStream();
        Workbook workbook = WorkbookFactory.create(workbookContent);
        // ...
}

/* Junit test pseudo-code */
public void testWorkbookProcessing() {
    RestfulService rs = new RestfulService();

    Workbook wb = WorkbookFactory.create(true)  // Create XSSF workbook
    CreationHelper createHelper = wb.getCreationHelper();
    Sheet sheet = wb.createSheet("Sheet 1");
    Row row = sheet.createRow(0);
    row.createCell(0).setCellValue(createHelper.createRichTextString("Row 1 Cell 1"));
    row.createCell(1).setCellValue(12345678);
    // ...

    HttpServletRequest request = new HttpServletRequest(); // Create HttpServletRequest
    // Create InputStream,using above Workbook <- Help!
    // Create Part object from InputStream <- Help!
    request.addPart(inputStream);  // Add Part object to request
    ResponseEntity re = rs.workbookProcessing(request);

    assertEquals(200,re.getStatusCodeValue());
}

或者,如果有办法模拟工作簿及其单元格值,我也很乐意这样做。

解决方法

经过相当多的研究、反复试验和结合技术,这里是我如何能够编写一个工作 Junit 测试来提交一个包含 Apache SS 工作簿对象的多部分 HTTP 请求。

// Working Junit test code:
@Test
public void testWorkbookProcessing() {

    RestfulService rs = new RestfulService();
    Workbook wb = WorkbookFactory.create(true)  // Create XSSF workbook
    CreationHelper createHelper = wb.getCreationHelper();
    Sheet sheet = wb.createSheet("Sheet 1");

    Row row = sheet.createRow(0);  // First row of sheet
    row.createCell(0).setCellValue(createHelper.createRichTextString("Row 1 Cell 1"));
    row.createCell(1).setCellValue(12345678);
    // ...

    // This is the code to create the multi-part content
    ByteArrayOutputStream baos = New ByteArrayOutputStream();
    wb.write(baos);  // Write workbook to output stream
    byte[] bytes = baos.toByteArray();  // Convert output stream to byte array
    MockPart part = new MockPart("file","test_filename.xlsx",bytes);  // Add byte array to mocked Part object

    MockMultipartHttpServletRequest request = new MockMultipartHttpServletRequest();
    request.setMethod(RequestMethod.POST.name());
    request.addHeader("Content-Type","multipart/form-data");
    request.addParameter("id","12345678");  // optional
    request.addPart(part);  // Add Part to request
    
    ResponseEntity re = rs.workbookProcessing(request);
    assertEquals(202,re.getStatusCodeValue());
    
}

感谢改进/评论/建议。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。