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

时间:2017-10-22 16:04:43

标签: json testing spring-boot mockmvc

上下文

我正在使用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 :(得分:0)

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

有多种方法可以设置数据类型序列化/反序列化,但我建议您将json正文值直接设置为HasMany(x => x.Elements) .AsSet() .Table("ElementTable") .KeyColumn("KeyColumn") .Cascade.All() .Component(x => { x.Map(c => c.Id); x.Map(c => c.Time); }) .LazyLoad(); ,格式为您希望接收的格式。例如:

String

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