gpt4 book ai didi

java - 如何使用 MockMvc 测试具有流内容的 Controller ?

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:04 25 4
gpt4 key购买 nike

我想在没有 Spring 上下文的情况下使用 MockMvc 测试 Spring Controller 。该 Controller 通过将内容写入响应的OutputStream流式传输内容。

这是 Controller 代码:

@RequestMapping(method = GET, value = "/file")
public void getFile(HttpServletResponse response) throws IOException {
response.setHeader("Content-Disposition", "attachment; filename=file.json");
ObjectWriter objectWriter = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL).writer();

Item item = new Item();
List<Item> items = new ArrayList<>();
items.add(item);

try (Writer bufferedWriter = new BufferedWriter(new OutputStreamWriter(response.getOutputStream()))) {
objectWriter.writeValue(bufferedWriter, items);
bufferedWriter.flush();
}
}

这是测试:

@Test
public void getFile_ok() throws Exception {
mockMvc.perform(get(END_POINT + "/file").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
}

该 Controller 运行良好,但单元测试失败并出现 IOException:

java.io.IOException: Stream closed
at java.io.BufferedWriter.ensureOpen(BufferedWriter.java:116)
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:126)
at java.io.BufferedWriter.flush(BufferedWriter.java:253)

最佳答案

实际上,objectWriter.writeValue(bufferedWriter, items); 尝试关闭流。

Java 文档:

Note: method does not close the underlying stream explicitly here; however, JsonFactory this mapper uses may choose to close the stream depending on its settings (by default, it will try to close it when JsonGenerator we construct is closed).

在运行时,它不会关闭它,但在我的测试中,它会关闭它,并且下一行 bufferedWriter.flush(); 只是发送 IOEception

为了解决这个问题,我添加了一个 try/catch 方法:

try {
writer.flush();
} catch (IOException e) {
logger.info("Stream closed in writeValue()", e);
}

关于java - 如何使用 MockMvc 测试具有流内容的 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34418437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com