Как передать FormData MultiValueMapклиенту WebFlux WebTest - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть форма WebFlux, использующая Thymeleaf, которая отправляет значение времени, которое преобразуется в Java LocalTime. Это прекрасно работает через пользовательский интерфейс, так как я заполняю и заполняю форму. Однако, когда я попытался проверить действие формы с помощью WebFlux WebTestClient, я получил следующую ошибку:

Failed to convert property value of type 'org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader$SynchronossPart' to required type 'java.time.LocalTime'

Мой тестовый код выглядит следующим образом:

@Test
public void addNewEntrySubmit() {
    MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
    formData.add("id", "ghj45679");
    formData.add("month", month);
    formData.add("dateOfMonth", Integer.toString(21));
    formData.add("day", "Tuesday");
    formData.add("startTime", LocalTime.parse("09:00", DateTimeFormatter.ofPattern("HH:mm")));
    formData.add("endTime", LocalTime.parse("17:00", DateTimeFormatter.ofPattern("HH:mm")));
    formData.add("breakLength", LocalTime.parse("00:30", DateTimeFormatter.ofPattern("HH:mm")));
    formData.add("onsite", Boolean.toString(false));

    given(service.addTimeKeepingEntry(any())).willReturn(Mono.empty());

    webTestClient.post().uri("/add-new-entry").contentType(MediaType.MULTIPART_FORM_DATA)
            .body(BodyInserters.fromMultipartData(formData)).exchange().expectStatus().isSeeOther().expectHeader().valueEquals(HttpHeaders.LOCATION, "/");


}

Редактировать: Ниже приведен метод контроллера. Как отмечалось ранее, это работает через браузер, а не тестовый код.

@PostMapping("/add-new-entry")
public Mono<String> addNewEntrySubmit(@Valid TimeKeepingEntry timeKeepingEntry, BindingResult bindingResult, Model model) {
    if (bindingResult.hasErrors()) {
        System.out.println(bindingResult.getAllErrors());
        model.addAttribute("metaTitle", "Add New Time Entry Validation");
        model.addAttribute("timeKeepingEntry", timeKeepingEntry);
        return Mono.just("add-entry");
    }
    timeKeepingEntry.setTotalHrs(Utils.calculateTotalHoursDay(timeKeepingEntry));
    System.out.println(timeKeepingEntry);
    return service.addTimeKeepingEntry(Flux.just(timeKeepingEntry)).log("Created Data").then(Mono.just("redirect:/")).log("Finished");
}

Я не уверен, что мне здесь не хватает или почему он не работает, нужно ли добавить еще один параметр в форме данных.

Редактировать. Я использую Spring Boot 2.0.5 и WebFlux 5.0.9

...