Проблема с десериализацией LocalDateTime в тесте Junit - PullRequest
1 голос
/ 11 марта 2019

У меня проблемы LocalDateTime десериализация в Junit тесте.У меня есть простой REST API, который возвращает некоторый DTO объект.Когда я звоню своей конечной точке, с ответом проблем нет - это правильно.Затем я пытаюсь написать модульный тест, получить MvcResult и с использованием ObjectMapper преобразовать его в мой DTO объект.Но я все еще получаю:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.time.LocalDateTime` out of START_ARRAY token
 at [Source: (String)"{"name":"Test name","firstDate":[2019,3,11,18,34,43,52217600],"secondDate":[2019,3,11,19,34,43,54219000]}"; line: 1, column: 33] (through reference chain: com.mylocaldatetimeexample.MyDto["firstDate"])

Я пытался с @JsonFormat и добавлял compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.8' к своему build.gradle, но я использую Spring Boot 2.1.3.RELEASE, так что он участвует в этом.Я понятия не имею, как это исправить.Моя простая конечная точка и модульный тест ниже:

@RestController
@RequestMapping("/api/myexample")
public class MyController {

    @GetMapping("{id}")
    public ResponseEntity<MyDto> findById(@PathVariable Long id) {

        MyDto myDto = new MyDto("Test name", LocalDateTime.now(), LocalDateTime.now().plusHours(1));
        return ResponseEntity.ok(myDto);
    }
}

MyDto класс

public class MyDto {

    private String name;
    private LocalDateTime firstDate;
    private LocalDateTime secondDate;

// constructors, getters, setters
}

Модульный тест

public class MyControllerTest {

    @Test
    public void getMethod() throws Exception {
        MyController controller = new MyController();
        MockMvc mockMvc = MockMvcBuilders.standaloneSetup(controller).build();

        MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/api/myexample/1"))
                .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();

        String json = mvcResult.getResponse().getContentAsString();
        MyDto dto = new ObjectMapper().readValue(json, MyDto.class);

        assertEquals("name", dto.getName());
    }
}

1 Ответ

1 голос
/ 11 марта 2019

Вы создаете новый ObjectMapper в тесте:

MyDto dto = new ObjectMapper().readValue(json, MyDto.class);

Попробуйте ввести ObjectMapper из Spring контекста или вручную зарегистрировать модуль:

mapper.registerModule(new JavaTimeModule());

в тесте.

См. Также:

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