如何使用MockMvc测试具有流内容的控制器?

时间:2015-12-22 14:46:33

标签: java spring spring-mvc outputstream mockmvc

我想使用 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)

1 个答案:

答案 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