在RestAssured中配置反序列化Json

时间:2017-01-09 17:26:06

标签: jackson rest-assured

我使用restAssured在我们的应用程序中测试休息服务。应用程序接收Json格式。在调用rest服务之前,RestAssured必须使用toString方法反序列化bean类的字段(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)。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我的目标是使用toString进行Serialize,我必须更改序列化功能:

objectMapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);

为:

objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); 

它解决了这个问题。