首页 > 解决方案 > Junit HTTP 请求测试与 Apache SS 工作簿?

问题描述

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

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

标签: springjava-11xssf

解决方案


经过相当多的研究、反复试验和组合技术,我能够编写一个有效的 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());
    
}

改进/评论/建议表示赞赏。


推荐阅读