Jan R. Krejci
Jan R. Krejci

Reputation: 119

Configure deserialize Json in RestAssured

I use restAssured to test rest service in our applications. The application receive a Json format. Before call the rest service, RestAssured must deserialize a field (ENUM) of bean class with toString method to achieve the response. Follow the code:

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");
    }
    //.....//
}

The restAssured only send the requestBody:

{
  "order_id" : "12312546",
  "condition" : "SUCCESS"
} 

It seems the configuration setted in ObjectMapper has been ignored. (DeserializationFeature.READ_ENUMS_USING_TO_STRING).

Anyone could help me?

Upvotes: 1

Views: 5308

Answers (1)

Jan R. Krejci
Jan R. Krejci

Reputation: 119

As my goal was to Serialize using toString I must change Serialization feature in:

objectMapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);

to:

objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true); 

It solved the problem.

Upvotes: 2

Related Questions