在春季合同中定义请求主体

时间:2020-07-07 11:19:43

标签: spring-boot spring-cloud-contract

我想在生产者API中使用spring cloud合同来写合同。

这是我的API:

    @PostMapping(path = "/person",
        produces = {MediaType.APPLICATION_JSON_VALUE}, consumes = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<PersonInfo> test(@RequestBody PersonRequest request){
    PersonInfo personInfo = bankService.getPersonInfo(request);
    return new ResponseEntity<>(personInfo, HttpStatus.OK);
}

我的groovy DSL:

  Contract.make {
   description("spring cloud contract")
   request {
   method 'POST'
   url '/person'
   headers {
    contentType(applicationJson())
  }
   body("""
 {
   "nationalId": "2548745"
 }
    """)

 }
  response {
 status 200
 body("""
 {
   "name": "Marc",
   "family": "Brown",
   "gender": "M"
}
""")
  headers {
     contentType(applicationJson())
   }
  }
}

PersonRequest:

public class PersonRequest {
private String nationalId;


public String getNationalId() {
    return nationalId;
}

public void setNationalId(String nationalId) {
    this.nationalId = nationalId;
}

}

现在,当我清理并安装项目时,会出现此错误:

预期: <415> 等于: <200> 但不是。

如果我将@RequestBody PersonRequest request更改为@RequestBody String request,一切正常。

我正在使用Spring Boot 2.3.1.RELEASE和spring-cloud-starter-contract-verifier 2.2.3.RELEASE和junit5

我用junit4测试了这种情况,没关系。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

不要更改dsl,请更改基类

RestAssuredMockMvc.config = new RestAssuredMockMvcConfig() .encoderConfig(new EncoderConfig(UTF_8.name(), UTF_8.name()));

或选择不加入默认内容字符集:

EncoderConfig encoderConfig = new EncoderConfig() .appendDefaultContentCharsetToContentTypeIfUndefined(false); RestAssuredMockMvcConfig restAssuredConf = new RestAssuredMockMvcConfig() .encoderConfig(encoderConfig); RestAssuredMockMvc.config = restAssuredConf;