diff --git a/spring-resttemplate/src/main/java/org/baeldung/web/dto/EmployeeDto.java b/spring-resttemplate/src/main/java/org/baeldung/web/dto/EmployeeDto.java new file mode 100644 index 0000000000..44c8ba5074 --- /dev/null +++ b/spring-resttemplate/src/main/java/org/baeldung/web/dto/EmployeeDto.java @@ -0,0 +1,38 @@ +package org.baeldung.web.dto; + +import java.util.Date; + +public class EmployeeDto { + + private String id; + private String name; + private Double salary; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Double getSalary() { + return salary; + } + + public void setSalary(Double salary) { + this.salary = salary; + } + + @Override public String toString() { + return "EmployeeDto{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", salary=" + salary + '}'; + } +} diff --git a/spring-resttemplate/src/main/java/org/baeldung/web/model/Employee.java b/spring-resttemplate/src/main/java/org/baeldung/web/model/Employee.java new file mode 100644 index 0000000000..0981cc2da1 --- /dev/null +++ b/spring-resttemplate/src/main/java/org/baeldung/web/model/Employee.java @@ -0,0 +1,53 @@ +package org.baeldung.web.model; + +import java.util.Date; +import java.util.Objects; + +public class Employee { + + private String id; + private String name; + private Double salary; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Double getSalary() { + return salary; + } + + public void setSalary(Double salary) { + this.salary = salary; + } + + @Override public String toString() { + return "Employee{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", salary=" + salary + '}'; + } + + @Override public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Employee employee = (Employee) o; + return Objects.equals(id, employee.id) && Objects.equals(name, employee.name) && Objects.equals(salary, employee.salary); + } + + @Override public int hashCode() { + + return Objects.hash(id, name, salary); + } +} diff --git a/spring-resttemplate/src/main/java/org/baeldung/web/service/EmployeeService.java b/spring-resttemplate/src/main/java/org/baeldung/web/service/EmployeeService.java new file mode 100644 index 0000000000..3a0222cb6c --- /dev/null +++ b/spring-resttemplate/src/main/java/org/baeldung/web/service/EmployeeService.java @@ -0,0 +1,51 @@ +package org.baeldung.web.service; + +import org.baeldung.web.dto.EmployeeDto; +import org.baeldung.web.model.Employee; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +public class EmployeeService { + + static final String EMP_URL_PREFIX = "http://localhost:8080/employee"; + static final String URL_SEP = "/"; + + private static final Logger logger = LoggerFactory.getLogger(EmployeeService.class); + + @Autowired + private RestTemplate restTemplate; + + public EmployeeDto getEmployee(String id) throws Exception { + + Employee emp = null; + try { + + ResponseEntity resp = restTemplate.getForEntity(EMP_URL_PREFIX + + URL_SEP + id, Employee.class); + + if (resp == null || resp.getStatusCode() != HttpStatus.OK + || resp.getBody() == null) { + + throw new Exception("Employee details could not be fetched."); + } + + emp = resp.getBody(); + + EmployeeDto dto = new EmployeeDto(); + dto.setId(emp.getId()); + dto.setName(emp.getName()); + dto.setSalary(emp.getSalary()); + return dto; + + } catch (Exception e) { + logger.error("Error occurred while fetching employee details", e); + throw new Exception("Error occurred while fetching employee details", e); + } + } +} diff --git a/spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java b/spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java new file mode 100644 index 0000000000..7c4bbb4e5e --- /dev/null +++ b/spring-resttemplate/src/test/java/org/baeldung/SpringTestConfig.java @@ -0,0 +1,19 @@ +package org.baeldung; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +@EnableAutoConfiguration +@ComponentScan("org.baeldung") +public class SpringTestConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + +} diff --git a/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java b/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java new file mode 100644 index 0000000000..7c2f535fae --- /dev/null +++ b/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceMockRestServiceServerUnitTest.java @@ -0,0 +1,70 @@ +package org.baeldung.web.service; + +import java.net.URI; + +import org.baeldung.SpringTestConfig; +import org.baeldung.web.dto.EmployeeDto; +import org.baeldung.web.model.Employee; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.client.MockRestServiceServer; +import org.springframework.test.web.client.match.MockRestRequestMatchers; +import org.springframework.test.web.client.response.MockRestResponseCreators; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = SpringTestConfig.class) +public class EmployeeServiceMockRestServiceServerUnitTest { + + private static final Logger logger = LoggerFactory.getLogger(EmployeeServiceMockRestServiceServerUnitTest.class); + + @Autowired + EmployeeService empService; + + @Autowired + RestTemplate restTemplate; + + MockRestServiceServer mockServer; + + ObjectMapper mapper = new ObjectMapper(); + + @Before + public void initMocks() { + mockServer = MockRestServiceServer.createServer(restTemplate); + } + + @Test + public void givenMockingIsDoneByMockRestServiceServer_whenGetIsCalled_shouldReturnMockedObject() throws Exception { + String id = "E001"; + Employee emp = new Employee(); + emp.setId(id); + emp.setName("Eric Simmons"); + emp.setSalary(10000.00d); + //employeeDao.create(emp); + + mockServer.expect(MockRestRequestMatchers.requestTo(new URI(EmployeeService.EMP_URL_PREFIX + + EmployeeService.URL_SEP + id))) + .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) + .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) + .contentType(MediaType.APPLICATION_JSON) + .body(mapper.writeValueAsString(emp))); + + EmployeeDto employeeDto = empService.getEmployee(id); + logger.info("Employee received as: {}", employeeDto); + Assert.assertEquals(emp.getName(), employeeDto.getName()); + Assert.assertEquals(emp.getId(), employeeDto.getId()); + } + +} diff --git a/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java b/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java new file mode 100644 index 0000000000..aa323dd685 --- /dev/null +++ b/spring-resttemplate/src/test/java/org/baeldung/web/service/EmployeeServiceUnitTest.java @@ -0,0 +1,49 @@ +package org.baeldung.web.service; + +import org.baeldung.web.dto.EmployeeDto; +import org.baeldung.web.model.Employee; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +public class EmployeeServiceUnitTest { + + private static final Logger logger = LoggerFactory.getLogger(EmployeeServiceUnitTest.class); + + @Mock + RestTemplate restTemplate; + + @Spy + @InjectMocks + EmployeeService empService = new EmployeeService(); + + @Before + public void initMocks() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void givenMockingIsDoneByMockito_whenGetIsCalled_shouldReturnMockedObject() throws Exception { + String id = "E001"; + Employee emp = new Employee(); + emp.setId(id); + emp.setName("Eric Simmons"); + emp.setSalary(10000.00d); + Mockito + .when(restTemplate.getForEntity(EmployeeService.EMP_URL_PREFIX + + EmployeeService.URL_SEP + id, Employee.class)) + .thenReturn(new ResponseEntity(emp, HttpStatus.OK)); + + EmployeeDto employeeDto = empService.getEmployee(id); + logger.info("Employee received as: {}", employeeDto); + Assert.assertEquals(emp.getName(), employeeDto.getName()); + Assert.assertEquals(emp.getSalary(), employeeDto.getSalary()); + } + +} diff --git a/spring-resttemplate/src/test/resources/logback-test.xml b/spring-resttemplate/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..9f48d36486 --- /dev/null +++ b/spring-resttemplate/src/test/resources/logback-test.xml @@ -0,0 +1,23 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + \ No newline at end of file