REST Assured Tutorial 52 – ResponseSpecification – Specify how the expected response must look like

Introduction

As a part of End to End REST Assured Tutorial, in this post, we will learn what is ResponseSpecification in Rest Assured and when and how to use it.

Prerequisite

I have used below dependency of Rest Assured library for this post:-



    io.rest-assured
    rest-assured
    4.3.1
    test

I have covered RequestSpecification earlier which you must go through once.

Why ResponseSpecification?

Observe the below lines of codes carefully. You will find that we have some common statements in both @Test methods after then() method call.

package ResponseSpecificationExample;

import org.hamcrest.Matchers;
import org.testng.annotations.Test;

import io.restassured.RestAssured;
import io.restassured.http.ContentType;

public class WithoutUsingResponseSpecification {
	
	@Test
	public void getAllBookings()
	{
		// Given
		RestAssured
		  .given()
			 .baseUri("https://restful-booker.herokuapp.com")
		// When
		   .when()
			  .get("/booking")
		// Then
		   .then()
		   .contentType(ContentType.JSON)
		   .time(Matchers.lessThan(5000L))
		   .statusLine("HTTP/1.1 200 OK")
		// To verify booking count
		   .body("size()", Matchers.greaterThan(5));		
	}
	
	@Test
	public void getBookingDetailsWithInvalidFirstName()
	{
		// Given
		RestAssured
		  .given()
			 .baseUri("https://restful-booker.herokuapp.com")
		// When
		   .when()
			  .get("/booking?firstname=Rahul")
		// Then
		   .then()
		// Repetitive validation as first test above
		   .contentType(ContentType.JSON)
		   .time(Matchers.lessThan(5000L))
		   .statusLine("HTTP/1.1 200 OK")
		// To verify booking count
		   .body("size()", Matchers.equalTo(0));
			
	}

}

Above we have only two tests but in real-time you may have many. A group of tests will have common assertions on response. Following the DRY principle is the best way to write clean code. We have repeated common assertions in both tests which is not a good practice. If we need to modify then we need to make changes every placed used.

To club common assertions together and put as a common entity, we can use ResponseSpecification in Rest Assured. ResponseSpecification is an interface that allows you to specify how the expected response must look like in order for a test to pass. This interface has readymade methods to define assertions like status code, content type, etc. We need to use expect() method of RestAssured class to get a reference for ResponseSpecification. Remember ResponseSpecification is an interface and we can not create an object of it.

How to use ResponseSpecification?

A ResponseSpecification can be created for some assertions as below:-

// Create a ResponseSpecification 
responseSpecification=  RestAssured.expect();
responseSpecification.contentType(ContentType.JSON);
responseSpecification.statusCode(200);
responseSpecification.time(Matchers.lessThan(5000L));
responseSpecification.statusLine("HTTP/1.1 200 OK");

We can add a ResponseSpecification using spec() method as below:-

...
.then()
.spec(responseSpecification)

Example Program

package ResponseSpecificationExample;

import org.hamcrest.Matchers;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.specification.ResponseSpecification;

public class UsingResponseSpecification {
	
	ResponseSpecification responseSpecification = null;
	
	@BeforeClass
	public void setupResponseSpecification()
	{
		// Create a ResponseSpecification 
		responseSpecification=  RestAssured.expect();
		responseSpecification.contentType(ContentType.JSON);
		responseSpecification.statusCode(200);
		responseSpecification.time(Matchers.lessThan(5000L));
		responseSpecification.statusLine("HTTP/1.1 200 OK");
		
	}
	
	@Test
	public void getAllBookings()
	{
		// Given
		RestAssured
		  .given()
			 .baseUri("https://restful-booker.herokuapp.com")
		// When
		   .when()
			  .get("/booking")
		// Then
		   .then()
		   // Just pass ResponseSpecification as below
		   .spec(responseSpecification)
		// To verify booking count
		   .body("size()", Matchers.greaterThan(5));
		
	}
	
	@Test
	public void getBookingDetailsWithInvalidFirstName()
	{
		// Given
		RestAssured
		  .given()
			 .baseUri("https://restful-booker.herokuapp.com")
		// When
		   .when()
			  .get("/booking?firstname=jim")
		// Then
		   .then()
		   .spec(responseSpecification)
		// To verify booking count
		   .body("size()", Matchers.equalTo(0));
			
	}

}

You can download/clone the above sample project from here.

You can subscribe to my YouTube channel RetargetCommon to learn from video tutorials.

If you have any doubt, feel free to comment below.
If you like my posts, please like, comment, share and subscribe.
#ThanksForReading
#HappyLearning

Find all Selenium related posts here, all API manual and automation related posts here, and find frequently asked Java Programs here.

Many other topics you can navigate through the menu.

Leave a Reply

Your email address will not be published. Required fields are marked *