在 RestAssured 中配置反序列化 Json
Configure deserialize Json in RestAssured
我使用 restAssured 来测试我们应用程序中的休息服务。应用程序接收 Json 格式。在调用rest服务之前,RestAssured必须用toString方法反序列化beanclass的一个字段(ENUM)来实现响应。
关注代码:
public enum Condition {
SUCCESS("success"),
FAILURE("failure");
private String condition;
private Condition(String condition) {
this.condition = condition;
}
@Override
public String toString() {
return this.condition;
}
}
public class Order {
private String order_id;
private Condition status;
//Getters and Setters
}
import static com.jayway.restassured.RestAssured.given;
import static com.jayway.restassured.RestAssured.preemptive;
import static org.assertj.core.api.Assertions.assertThat;
import static com.jayway.restassured.config.RestAssuredConfig.config;
import static com.jayway.restassured.config.ObjectMapperConfig.objectMapperConfig;
public class RestTests {
//.....//
private static RequestSpecification spec;
public static final Order inputOrderInvalid =
new Order.Builder()
.setOrderId("213424")
.setCondition(Condition.SUCCESS)
.build();
@BeforeClass
public static void initSpec(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, false);
RestAssuredConfig config = config().objectMapperConfig(objectMapperConfig().jackson2ObjectMapperFactory((cls, charset) -> objectMapper));
spec = new RequestSpecBuilder()
.setConfig(config)
.setContentType(ContentType.JSON)
.setBaseUri(ENDPOINT_URI)
.addFilter(new ResponseLoggingFilter())//log request and response for better debugging. You can also only log if a requests fails.
.addFilter(new RequestLoggingFilter())
.build();
}
@Test
public void orderInvalid(){
JsonPath error = given()
.spec(spec)
.body(inputOrderInvalid)
.when()
.post(SERVICE)
.then()
.statusCode(HttpStatus.SC_BAD_REQUEST)
.extract()
.jsonPath();
assertThat(error.getString("code")).isEqualTo("INCORRECT_VALUE");
}
//.....//
}
restAssured只发送requestBody:
{
"order_id" : "12312546",
"condition" : "SUCCESS"
}
似乎忽略了ObjectMapper中设置的配置。 (DeserializationFeature.READ_ENUMS_USING_TO_STRING).
有人能帮帮我吗?
因为我的目标是使用 toString 序列化,所以我必须更改序列化功能:
objectMapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
至:
objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
问题解决了。
我使用 restAssured 来测试我们应用程序中的休息服务。应用程序接收 Json 格式。在调用rest服务之前,RestAssured必须用toString方法反序列化beanclass的一个字段(ENUM)来实现响应。 关注代码:
public enum Condition {
SUCCESS("success"),
FAILURE("failure");
private String condition;
private Condition(String condition) {
this.condition = condition;
}
@Override
public String toString() {
return this.condition;
}
}
public class Order {
private String order_id;
private Condition status;
//Getters and Setters
}
import static com.jayway.restassured.RestAssured.given;
import static com.jayway.restassured.RestAssured.preemptive;
import static org.assertj.core.api.Assertions.assertThat;
import static com.jayway.restassured.config.RestAssuredConfig.config;
import static com.jayway.restassured.config.ObjectMapperConfig.objectMapperConfig;
public class RestTests {
//.....//
private static RequestSpecification spec;
public static final Order inputOrderInvalid =
new Order.Builder()
.setOrderId("213424")
.setCondition(Condition.SUCCESS)
.build();
@BeforeClass
public static void initSpec(){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, false);
RestAssuredConfig config = config().objectMapperConfig(objectMapperConfig().jackson2ObjectMapperFactory((cls, charset) -> objectMapper));
spec = new RequestSpecBuilder()
.setConfig(config)
.setContentType(ContentType.JSON)
.setBaseUri(ENDPOINT_URI)
.addFilter(new ResponseLoggingFilter())//log request and response for better debugging. You can also only log if a requests fails.
.addFilter(new RequestLoggingFilter())
.build();
}
@Test
public void orderInvalid(){
JsonPath error = given()
.spec(spec)
.body(inputOrderInvalid)
.when()
.post(SERVICE)
.then()
.statusCode(HttpStatus.SC_BAD_REQUEST)
.extract()
.jsonPath();
assertThat(error.getString("code")).isEqualTo("INCORRECT_VALUE");
}
//.....//
}
restAssured只发送requestBody:
{
"order_id" : "12312546",
"condition" : "SUCCESS"
}
似乎忽略了ObjectMapper中设置的配置。 (DeserializationFeature.READ_ENUMS_USING_TO_STRING).
有人能帮帮我吗?
因为我的目标是使用 toString 序列化,所以我必须更改序列化功能:
objectMapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
至:
objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);
问题解决了。