Spring MVC 当我的镜像下载作为Spring资源返回时,我如何验证它?

r1zk6ea1  于 2022-12-19  发布在  Spring
关注(0)|答案(1)|浏览(134)

我使用的是SpringWebMvc5.3(沿着相同版本的spring-test模块)。我使用的mockito版本是3.6。我有一个控制器方法,在其中我下载了一个图像文件...

import org.springframework.core.io.InputStreamResource;
import org.springframework.core.io.Resource;

...
  @Override
  public ResponseEntity<Resource> download(Long imgd)
    ...
    InputStream result =
        myService.getImageFile(imgId);
    ...
    
    Resource resource = new InputStreamResource(result);
    HttpHeaders responseHeaders = new HttpHeaders();
    ...

    return ResponseEntity.ok().headers(responseHeaders).body(resource);

在我的单元测试中,我希望验证一个成功的结果,因此我

MockMvc mockMvc;

  @Test
  void testDownloadImg() {

    File imageFile = new File("src/test/resources", "test.png");
    InputStream inputStream = new FileInputStream(imageFile);
    byte[] imgAsBytes = new byte[inputStream.available()];
    inputStream.read(imgAsBytes);

    ...
    when(myMockImgService.getImageFile(id)).thenReturn(inputStream);
    byte[] expectedContent = Files.readAllBytes(imageFile.toPath());
    mockMvc
        .perform(
            get(DOWNLOAD_URL)
                .contentType(MediaType.APPLICATION_JSON))
        .andExpect(content().bytes(imgAsBytes)
        .andExpect(status().isOk())

不幸的是,这总是失败,因为从我的方法返回的内容(content().bytes())总是“{}"。当我实时运行我的控制器方法时,图像被很好地返回,所以看起来这里唯一的问题是编写一个测试用例来验证它。因为我使用代码生成工具,所以我必须维护返回ResponseEntity的契约。

ddrv8njm

ddrv8njm1#

问题是在返回imgAsBytes作为模拟响应之前,您将所有输入流读取到imgAsBytes中,这会导致返回空流。要解决此问题,您可以使用已有的expectedContent进行Assert:

File imageFile = new File("src/test/resources", "test.png");
        InputStream inputStream = new FileInputStream(imageFile);
//        byte[] imgAsBytes = new byte[inputStream.available()];
//        inputStream.read(imgAsBytes);

        when(mainService.getImageFile(any())).thenReturn(inputStream);

        byte[] expectedContent = Files.readAllBytes(imageFile.toPath());
        mockMvc
                .perform(
                        get("/download").contentType(MediaType.APPLICATION_JSON))
                .andExpect(content().bytes(expectedContent))
                .andExpect(status().isOk());

相关问题