Застрял с тестированием конечной точки REST для загрузки изображений с использованием JMockit и весенней загрузки webflux.
Моя конечная точка REST выглядит так:
@RestController
@RequestMapping("/v1/files")
@RequiredArgsConstructor
public class FileController {
private final SomeService someService;
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseStatus(HttpStatus.CREATED)
public Mono<SomeDTO> upload(@Valid File metadata, Mono<FilePart> file) {
return file.flatMap(part -> someService.upload(metadata, part));
}
}
Файловый объект содержит только несколько строковых полей, которые необходимо заполнить в запросе.
Конечная точка загрузки теста:
@RunWith(SpringRunner.class)
@WebFluxTest(FileController.class)
public class FileControllerTest {
@Mocked
private SomeService someService;
@Autowired
private WebTestClient webTestClient;
@Test
public void testUpload(@Injectable FilePart filePart) {
File file = new File().setSomeStringField(...).setSomeStringField(...);
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("file", filePart);
body.add("someString1", "string1");
body.add("someString2", "string2");
new Expectations() {{
someService.upload(file, filePart);
result = Mono.just(new SomeDTO(FILE_ID));
}};
this.webTestClient.post().uri("/v1/files")
.contentType(MediaType.MULTIPART_FORM_DATA)
.syncBody(BodyInserters.fromMultipartData(body))
.exchange()
.expectStatus().isCreated()
.expectBody(ResponseEntity.class);
}
}
Сейчас тест не пройден с ошибкой:
Content type 'multipart/form-data' not supported
org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'multipart/form-data' not supported
Изменен мой тест на следующий вид:
@Test
public void testUpload(@Injectable FilePart filePart) {
File file = new File().setSomeStringField(...).setSomeStringField(...);
MultipartBodyBuilder builder = new MultipartBodyBuilder();
body.asyncPart("file", Mono.just(filePart), FilePart.class);
body.part("someString1", "string1");
body.part("someString2", "string2");
new Expectations() {{
someService.upload(file, filePart);
result = Mono.just(new SomeDTO(FILE_ID));
}};
this.webTestClient.post().uri("/v1/files")
.body(BodyInserters.fromMultipartData(body))
.exchange()
.expectStatus().isCreated()
.expectBody(ResponseEntity.class);
}
По-прежнему происходит сбой, но с другой ошибкой:
Status expected:<201> but was:<500>
> POST http://localhost:8080/v1/files
> WebTestClient-Request-Id: [1]
> Content-Type: [multipart/form-data;boundary=3C1UP7-37twv--Qlh12H5hoTPVN63HLh;charset=UTF-8]
I/O failure: org.springframework.core.codec.CodecException: No suitable writer found for part: file