spring - 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());
}
或者,如果有一种方法可以模拟工作簿及其单元格值,我也很乐意这样做。
解决方案
经过相当多的研究、反复试验和组合技术,我能够编写一个有效的 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());
}
改进/评论/建议表示赞赏。
推荐阅读
- swift - 如何将标签/元素约束到标签栏?
- reactjs - React js:反应路由器不重定向
- python - 在第一个条目中给定相同的值创建新的 Numpy 2D 数组
- c# - C#如何为正则表达式找到正确的模式
- c# - 我正在尝试使用变量销毁实例化的游戏对象,但它说该变量不存在。(统一 C#)
- asp.net-web-api - 在 .NET Core API 中自定义 Swagger Code Gen 和 SwashbuckleUI
- vb.net - 如何使用 HSM 提供程序在 VB.net 中生成 ECDH 密钥
- javascript - unboundStoryFn(...):渲染没有返回任何内容。这通常意味着缺少 return 语句。或者,不渲染任何内容,返回 null
- javascript - 如何让地理定位在我的手机中工作?
- java - 根据配置向不同的Kafka主题发送消息