我想使用 MockMvc 测试没有Spring上下文的Spring控制器。 此控制器通过将内容写入响应的 OutputStream 来>>内容
。这是控制器代码:
@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());
}
此控制器运行良好,但单元测试因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)
答案 0 :(得分:0)
实际上plot for [i=1:3] for [m in "A B C D"] filename(i,m) u 1:2 not
会尝试关闭该流。
的Javadoc:
注意:方法不会在此显式关闭基础流; 但是,这个mapper使用的JsonFactory可能会选择关闭流 取决于其设置(默认情况下,它将尝试关闭它 我们构建的JsonGenerator已关闭。
在运行时,它不会关闭它,但在我的测试中,确实如此,下一行objectWriter.writeValue(bufferedWriter, items);
只发送bufferedWriter.flush();
。
所以为了解决这个问题,我以这种方式添加了try / catch:
IOEception