mockito Spring MockMVC MockMultipartFile:无法使用模拟文件getInputStream()对方法进行存根处理

n53p2ov0  于 2023-10-18  发布在  Spring
关注(0)|答案(1)|浏览(143)

我无法存根MockMultipartFile InputStream,因为每次它调用getInputStream时都会构造一个新的ByteArrayInputStream。

@Override
public InputStream getInputStream() throws IOException {
    return new ByteArrayInputStream(this.content);
}

因此,当我stub我的InputService时,我无法返回

final Integer value1 = 2023;
final Boolean value2 = Boolean.TRUE;
final MockMultipartFile file = new MockMultipartFile(
    "file",
    "file.csv",
    MediaType.TEXT_PLAIN_VALUE,
    "Hello, World!".getBytes()
);

when(inputService.validateInput(value1, value2, file.getInputStream()))
    .thenReturn(ValidationResult.builder().build());

mockMvc.perform(multipart("/file/validate")
        .file(file)
        .param("value1", value1.toString())
        .param("value2", value2.toString())
    )
    .andDo(print()).andExpect(status().isOk())             
    .andExpect(content().contentType(MediaType.APPLICATION_JSON));

当我的控制器调用inputService时,它将返回null,而不是我在thenReturn中创建的对象。
如何在这里存根inputService.validateInput,使validateInput返回我在测试中创建的对象?
我尝试同时使用anyObject()和any(InputStream.class),但它不起作用。

final InputStream inputStream = ArgumentMatchers.any(InputStream.class);

参数匹配器的使用无效!

vltsax25

vltsax251#

它通过使用org.mockito.ArgumentMatchers.any()来匹配InputStream。

when(inputService.validateInput(eq(value1), eq(value2), any()))
    .thenReturn(ValidationResult.builder().build());

它不能使用org.mockito.ArgumentMatchers.any(InputStream.class)
虽然由于MockMultipartFile在调用getInputStream()时构造了一个ByteArrayInputStream,但它确实可以通过将ByteArrayInputStream.class指定为any()来工作。

when(inputService.validateInput(eq(value1), eq(value2), any(ByteArrayInputStream.class)))
    .thenReturn(ValidationResult.builder().build());

相关问题