在 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); 

问题解决了。