我使用的是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的契约。
1条答案
按热度按时间ddrv8njm1#
问题是在返回
imgAsBytes
作为模拟响应之前,您将所有输入流读取到imgAsBytes
中,这会导致返回空流。要解决此问题,您可以使用已有的expectedContent
进行Assert: