首页 文章

MockMvc在RestController测试中使用空字段保存Json

提问于
浏览
0

上下文

我正在Spring Boot中开发小型REST应用程序 . 我想执行测试控制器(POST.METHOD),它将新对象添加到数据库 .

问题

我通过构造函数创建新实体,并在对象中指定字段 . 然后我通过MockMvc保存这个对象 . 并且有一个问题,MockMvc保存了我的对象,但所有字段都为null或false . 控制器使用的服务经过测试并正常运行

守则

控制器:

@RestController
    public class ParkingMeterController {

    @Autowired
    ParkingMeterService parkingMeterService;

    @PostMapping("parking-meter")
    public ParkingMeter addParkingMeter(){
        ParkingMeter parkingMeter = new ParkingMeter();
        return parkingMeterService.addNewParkingMeter(parkingMeter);
    }

实体:

@Entity
    @Component
    @Data
    public class ParkingMeter {

    @Id
    @GeneratedValue
    private long id;
    private boolean occupied = false;
    private Timestamp startTime;
    private Timestamp endTime;

    public ParkingMeter() {
    }

    public ParkingMeter(boolean occupied, Timestamp startTime, Timestamp endTime) {
        this.occupied = occupied;
        this.startTime = startTime;
        this.endTime = endTime;
    }
}

测试类:

@RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class ParkingMeterControllerTest {

    @Autowired
    private MockMvc mvc;
    @Autowired
    ParkingMeterService parkingMeterService;

    @Test
    public void shouldAddNewParkingMeter() throws Exception {
        ParkingMeter parkingMeter = new ParkingMeter(true, new Timestamp(0), new Timestamp(5000));
        String json = new Gson().toJson(parkingMeter);
        System.out.println(json);

        mvc.perform(post("/parking-meter/")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .content(json)
                .accept(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.id", is(3)))
                .andExpect(jsonPath("$.startTime", is(new Timestamp(0))));
    }

系统输出打印结果:

{"id":0,"occupied":true,"startTime":"Jan 1, 1970 1:00:00 AM","endTime":"Jan 1, 1970 1:00:05 AM"}

MockServletResponse:

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {Content-Type=[application/json;charset=UTF-8]}
     Content type = application/json;charset=UTF-8
             Body = {"id":3,"occupied":false,"startTime":null,"endTime":null}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

如上所示 . 在Mock servlet resposne中,我们可以看到Body的null和false字段与我定义的字段不同 .

提前致谢 .

1 回答

  • 0

    猜猜,问题是你是以日期格式序列化时间戳(使用Gson映射器),但是以其他格式反序列化(比如使用Spring默认的Jackson映射器) .

    有很多方法可以设置数据类型序列化/反序列化,但我建议你直接将json体值设置为 String ,格式为您期望接收的格式 . 例如:

    String json = "{\"id\":0,\"occupied\":true,\"startTime\":\"0000000000000\",\"endTime\":\"0000000005000\"}"

    这种方法将保证您的测试也会检查序列化/反序列化问题!

相关问题