我LocalDateTime在Junit测试中反序列化有问题。我有简单的REST API返回一些DTO对象。当我呼叫端点时,响应没有问题- 是正确的。然后,我尝试编写单元测试,获取MvcResult并将其ObjectMapper转换为我的DTO对象。但我仍然收到:
LocalDateTime
Junit
REST API
DTO
MvcResult
ObjectMapper
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它,因此它参与其中。我不知道如何解决它。我的简单端点和单元测试如下:
@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()); } }
您ObjectMapper在测试中创建新的:
MyDto dto = new ObjectMapper().readValue(json, MyDto.class);
尝试ObjectMapper从Spring上下文注入或手动注册模块:
Spring
mapper.registerModule(new JavaTimeModule());