【问题标题】:Junit HTTP request test with Apache SS Workbook?Junit HTTP 请求测试与 Apache SS 工作簿?
【发布时间】:2021-06-25 16:39:57
【问题描述】:

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

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

【问题讨论】:

    标签: spring java-11 xssf


    【解决方案1】:

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

    感谢改进/cmets/建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-04
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多