MockMvc集成或单元测试POST API,该API接受@Valid Object、BindingResult、Mul



我如何测试一个采用Multipartfile等参数的post-api方法。根据spring文档,我知道我必须使用multipart而不是post来处理MockMvc,但我的响应状态是400而不是200。(可以用你自己的例子给我一个如何测试的想法(。

测试类别和方法

@Autowired
private MockMvc mockMvc;
@MockBean
private ProductService productService;
@Test
void newProduct() {
// Given
Product product = new Product("Test", "Diary", "Lorem 24", "fresh-pepper.jpg");
product.setId(1L);
product.setPath("dummy photo path");
MockMultipartFile multipartFile = new MockMultipartFile("file",
"fresh-pepper.jpg",
"image/png, image/jpg, image/jpeg",
"random image".getBytes());
//When
when(productService.saveProduct(product, multipartFile)).thenReturn(product);
//Then
try {
this.mockMvc.perform(multipart("/dummy/api/v1/addNew")
.file(multipartFile))
.andDo(print())
.andExpect(status().isOk());
} catch (Exception e) {
e.printStackTrace();
}
}

Rest-api方法和NOTE@RequestMapping("/dummy/api/v1")

@PostMapping(path = "/addNew", consumes = {MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<Product> newProduct(@Valid Product product,
BindingResult bindingResult,
@RequestParam("file") MultipartFile file) {
if (bindingResult.hasFieldErrors()){
bindingResult.getFieldErrors().forEach(fieldError -> LOGGER.error("Error " + fieldError.getField()));
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(productService.saveProduct(product, file), HttpStatus.OK);
}

问题是我没有像使用post-man测试api那样传递参数。所以基本上就是这样。

@Test
void newProduct() {
// Given
MockMultipartFile multipartFile = new MockMultipartFile("file",
"fresh-pepper.jpg",
"image/png, image/jpg, image/jpeg",
"random image".getBytes());
//Then
try {
this.mockMvc.perform(
multipart("/secured/api/v2/addNew")
.file(multipartFile)
.param("name", "Test")
.param("category", "Test")
.param("description", "Lorem 23")
)
.andDo(print())
.andExpect(status().isOk());
} catch (Exception e) {
e.printStackTrace();
}
}

相关内容

最新更新