springboot中的Controller层单元测试一直报属性字段为空的错误

it2025-04-06  20

其中我的实体类是这样的

@Data @AllArgsConstructor @NoArgsConstructor @Entity @Table(name = "exam_project") @ApiModel("项目实体类") public class item { /* * @Id:声明这是一个主键 @GeneratedValue:主键生成策略 像自增策略 strategy: 策略生成方式 @Column: 对应数据库表中的字段 name:字段的名称 * */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @ApiModelProperty(value = "项目id") private Integer id; // @NotBlank 用于String字段的校验 @ApiModelProperty(value = "项目名") @NotBlank(message = "项目名不为空") @Column(name = "project_name") private String projectName; @NotBlank(message = "项目时长不为空") @Column(name = "project_duration") @ApiModelProperty(value = "项目时长") private String projectDuration; @NotBlank(message = "项目负责人不能为空") @Column(name = "project_principal") @ApiModelProperty(value = "负责人项目") private String projectPrincipal; @Column(name = "project_creattime") @ApiModelProperty(value = "项目创建时间") private Date projectCreatTime; @Column(name = "project_updatetime") @ApiModelProperty(value = "项目修改时间") private Date projectUpdateTime;

其中Controller层的代码是这样的

// @Valid 校验字段是否为空 @ApiOperation("添加项目") @PostMapping(value = "/add", produces = "application/json; charset=utf-8") public Map<String, Object> AddItem(@Valid item item,BindingResult results) { Map<String, Object> map = new HashMap<>(); item item1 = new item(); item1.setProjectName(item.getProjectName()); //设置项目名字 item1.setProjectDuration(item.getProjectDuration()); //设置项目时长 item1.setProjectPrincipal(item.getProjectPrincipal()); //设置项目负责人 item1.setProjectCreatTime(new Date()); //设置项目创建时间 if (results.hasErrors()) { //检测字段有无null异常 map.put("status", "error"); //状态标识 String message = results.getFieldError().getDefaultMessage(); map.put("msg", message); //封装错误信息 }else { map.put("status", "success"); //状态标识 itemMapper.save(item1); //保存操作 } return map; }

单元测试是这样的

//测试插入数据 @Test public void AddItem() throws Exception { Map<String, String> map = new HashMap<>(); map.put("projectName","街道通行系统"); //项目名称 map.put("projectDuration","300天"); //项目时长 map.put("projectPrincipal","张无忌"); //项目负责人 // 要在Controller层中的方法参数加@RequestBody这个注解,不然就会一直报400,数据传不到Controller层 MvcResult result = mockMvc.perform(post("/item/add").contentType(MediaType.APPLICATION_JSON_UTF8).content(JSONObject.toJSONString(map))) .andDo(print()) // 打印出请求和相应的内容 .andExpect(status().isOk())// 模拟向testRest发送get请求 .andReturn();// 返回执行请求的结果 System.out.println(result.getResponse().getContentAsString()); }

运行这个单元测试的时候会一直报项目时长为空这个问题。测试的数据传不到Controller层中。

我看了一下我的单元测试代码,发现项目时长有数据

Map<String, String> map = new HashMap<>(); map.put("projectName","街道通行系统"); //项目名称 map.put("projectDuration","300天"); //项目时长 map.put("projectPrincipal","张无忌"); //项目负责人

后来经过多次尝试之后,发现Post请求中的参数需要加一个@RequestBody这个注解,只需要加上这个注解,这个问题就解决了。 测试的时候,把数据都封装成json数据格式了,而在Controller层识别不了这个json格式,而 @RequestBody的作用其实是将json格式的数据转为java对象

最新回复(0)