Reputation: 119
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
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