当前位置: 首页 > 知识库问答 >
问题:

MockMvc在RestController测试中保存带空字段的Json

施誉
2023-03-14

我正在spring boot开发小型REST应用程序。我想执行test Controller(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 = []

正如你在上面看到的。在模拟servlet resposne中,我们可以看到带有null和false字段的Body,这些字段与我定义的不同。

提前道谢。

共有1个答案

逄皓轩
2023-03-14

我猜,问题是你用日期格式序列化了时间戳(使用Gson映射器),但用另一种格式反序列化了它(比如使用spring默认的jackson映射器)。

有很多方法可以设置数据类型序列化/反序列化,但我建议您将json body值直接设置为一个string,其格式是您希望收到的。对于EX:

string json=“{\”id\“:0,\”occeding\“:true,\”starttime\“:\”0000000000000\“,\”endtime\“:\”0000000005000\“}”

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

 类似资料:
  • 我有一个简单的junit测试,用于验证servletendpoint的响应。 问题:我想以java对象Person而不是字符串/json/xml表示形式获取响应。 这可能吗?

  • 我已经检查了IntelliJ的调试器,并且可以确认mockMvc本身为空。因此,异常消息告诉我的只是“java.lang.NullPointerException”。 我已经尝试过为测试类添加更通用的Spring Boot注释,比如“@SpringBootTest”或“@RunWith(SpringRunner.class)”,以防与初始化Spring有关,但没有成功。

  • 想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。 我想进行联调。我目前的方法: 我放置了@AutoConfigreMockMvc,但MockMvc对象仍然为空

  • 问题内容: 我正在订购我的数据,并且其工作正常,但某些字段为空或没有值。订购时,这些空字段首先出现。例如,当订购数字时,我们将在获得“ 0”值之前得到一个巨大的空列表。 我这样做是这样的: 和 JSFiddle:http : //jsfiddle.net/JZuCX/1/ 有没有简单而优雅的方法可以解决此问题?无论什么情况,我都希望空白字段排在最后。 问题答案: 我要编写一个过滤器,该过滤器从有序

  • 问题内容: 我正在尝试保存订单以及订单中的产品。 订单已保存,但产品未保存。 我有一张桌子,一张桌子和一张桌子。 在订单模型中,我设置了 在桌子上,我有几个额外的字段:,加上,以记录销售价格和售出数量。 我通过以下方式保存数据: $ this-> Order-> saveAll($ data); 这是$ data是什么: 订单已保存到订单表,但什么也没有保存到orders_products表。我希

  • 我需要jUnit测试的帮助,我的结果是json文件,我需要测试该文件的长度,问题是在jsonPath函数中没有这样的方法。 这里是我的测试方法,预期长度是7。如有任何帮助,我将不胜感激,谢谢