Learn to consume HTTP POST REST API with Spring TestRestTemplate. In this post request test example, we will be sending request body along with request headers.
1. Maven dependencies
Make sure, you have spring-boot-starter-test dependency in your project to get access to TestRestTemplate class in runtime. If you are using the @SpringBootTest annotation, a TestRestTemplate is automatically available and can be @Autowired into your test.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
2. HTTP POST API
We are using the code base of Spring boot 2 rest example. The POST API is given as below.
- It adds an employee in the employees collection.
- It accept employee data in
Employeeobject. - It accepts and creates JSON meda type.
- It accepts two HTTP headers i.e. X-COM-PERSIST and X-COM-LOCATION. First header is required and second header is optional.
- It returns the location of resource created.
package com.howtodoinjava.rest.controller;
import java.net.URI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import com.howtodoinjava.rest.dao.EmployeeDAO;
import com.howtodoinjava.rest.model.Employee;
import com.howtodoinjava.rest.model.Employees;
@RestController
@RequestMapping(path = "/employees")
public class EmployeeController
{
@Autowired
private EmployeeDAO employeeDao;
@PostMapping(path= "/", consumes = "application/json", produces = "application/json")
public ResponseEntity<Object> addEmployee(
@RequestHeader(name = "X-COM-PERSIST", required = true) String headerPersist,
@RequestHeader(name = "X-COM-LOCATION", required = false, defaultValue = "ASIA") String headerLocation,
@RequestBody Employee employee)
throws Exception
{
//Generate resource id
Integer id = employeeDao.getAllEmployees().getEmployeeList().size() + 1;
employee.setId(id);
//add resource
employeeDao.addEmployee(employee);
//Create resource location
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(employee.getId())
.toUri();
//Send location in response
return ResponseEntity.created(location).build();
}
}
I am not going to discuss other classes as it is not related to rest api testing. You can download the sourcecode and see to understand more.
3. Spring TestRestTemplate
To test POST API, we need to create spring boot test class annotated with @SpringBootTest.
package com.howtodoinjava.rest;
import java.net.URI;
import java.net.URISyntaxException;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import com.howtodoinjava.rest.model.Employee;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
public class SpringBootDemoApplicationTests
{
@Autowired
private TestRestTemplate restTemplate;
@LocalServerPort
int randomServerPort;
@Test
public void testAddEmployeeSuccess() throws URISyntaxException
{
final String baseUrl = "http://localhost:"+randomServerPort+"/employees/";
URI uri = new URI(baseUrl);
Employee employee = new Employee(null, "Adam", "Gilly", "test@email.com");
HttpHeaders headers = new HttpHeaders();
headers.set("X-COM-PERSIST", "true");
HttpEntity<Employee> request = new HttpEntity<>(employee, headers);
ResponseEntity<String> result = this.restTemplate.postForEntity(uri, request, String.class);
//Verify request succeed
Assert.assertEquals(201, result.getStatusCodeValue());
}
@Test
public void testAddEmployeeMissingHeader() throws URISyntaxException
{
final String baseUrl = "http://localhost:"+randomServerPort+"/employees/";
URI uri = new URI(baseUrl);
Employee employee = new Employee(null, "Adam", "Gilly", "test@email.com");
HttpHeaders headers = new HttpHeaders();
HttpEntity<Employee> request = new HttpEntity<>(employee, headers);
ResponseEntity<String> result = this.restTemplate.postForEntity(uri, request, String.class);
//Verify bad request and missing header
Assert.assertEquals(400, result.getStatusCodeValue());
Assert.assertEquals(true, result.getBody().contains("Missing request header"));
}
}
4. Spring boot TestRestTemplate POST example – Demo
Execute the test class as JUnit test. It will start the server and deploy the API as it will be done normally. Then It will execute the tests.
You can verify the tests in JUnit tab.

Let me know if you have a query in this spring boot TestRestTemplate postForEntity() example.
Happy Learning !!
Comments