使用 WebtestClient 测试 MultipartFile

pvp*_*ran 7 java unit-testing spring-boot spring-webflux

我正在为我的控制器类编写单元测试。我正在使用 spring webflux。因此我正在使用 编写测试WebTestClient。这是我的控制器方法

@PutMapping("/updatedocument/{documentType}")
public ResponseEntity<String> updateDocument(@PathVariable String documentType,
                                             @RequestParam("file") MultipartFile file) {
     ...................
}
Run Code Online (Sandbox Code Playgroud)

当我从 Postman 或任何其他客户端调用时,此代码有效。我在编写单元测试时遇到困难。我正进入(状态

“所需的 MultipartFile 参数‘文件’不存在”

错误 。这是我的测试方法。

@Test
void updateDocument() throws IOException {

    .............
    MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder();
    multipartBodyBuilder.part("file", new ClassPathResource("somefile"))
            .contentType(MediaType.MULTIPART_FORM_DATA)

    webTestClient.put()
            .uri("/customer/updatedocument/ID")
            .body(BodyInserters.fromMultipartData(multipartBodyBuilder.build()))
            .exchange()
            .expectStatus().isOk();
}
Run Code Online (Sandbox Code Playgroud)

任何建议都非常感激。请注意。我正在使用WebTestClient而不是MovkMvc

pvp*_*ran 4

我能够解决这个问题。罪魁祸首是我的控制器方法,而不是测试方法。

必须更改控制器方法中的一些内容。当使用 Spring Web Flux(Reactive) 时,我们应该使用

1.@RequestPart代替@RequestParam
2.FilePart代替MultipartFile

所以控制器方法将如下所示。

@PutMapping("/updatedocument/{documentType}")
public ResponseEntity<String> updateDocument(@PathVariable DocumentType documentType,
                                             @RequestPart("file") FilePart filePart) {
   .....................
}
Run Code Online (Sandbox Code Playgroud)

您可以将 FilePart 转换为 File 对象。