Загрузить тестирование конечной точки REST - PullRequest
0 голосов
/ 30 октября 2018

Застрял с тестированием конечной точки 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
...