BAEL-2736 rest assured spring mock mvc (#6466)
* Include rest-assured.spring-mock-mvc dependency BAEL-2736 * Rest Assured Spring Mock MVC Tests BAEL-2736
This commit is contained in:
parent
d84dedbb95
commit
fda8a29eb6
|
@ -19,6 +19,10 @@
|
|||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-json</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
|
@ -143,15 +147,6 @@
|
|||
<artifactId>wiremock</artifactId>
|
||||
<version>${wiremock.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>rest-assured</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>json-schema-validator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.fge</groupId>
|
||||
<artifactId>json-schema-validator</artifactId>
|
||||
|
@ -167,6 +162,23 @@
|
|||
<artifactId>commons-collections</artifactId>
|
||||
<version>${commons-collections.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Rest Assured Dependencies-->
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>rest-assured</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>spring-mock-mvc</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>json-schema-validator</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
package com.baeldung.restassured.learner;
|
||||
|
||||
class Course {
|
||||
|
||||
private String code;
|
||||
|
||||
public Course() {
|
||||
}
|
||||
|
||||
Course(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
String getCode() {
|
||||
return code;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package com.baeldung.restassured.learner;
|
||||
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import static org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE;
|
||||
|
||||
@RestController
|
||||
@RequestMapping(path = "/courses")
|
||||
public class CourseController {
|
||||
|
||||
private final CourseService courseService;
|
||||
|
||||
public CourseController(CourseService courseService) {
|
||||
this.courseService = courseService;
|
||||
}
|
||||
|
||||
@GetMapping(produces = APPLICATION_JSON_UTF8_VALUE)
|
||||
public Collection<Course> getCourses() {
|
||||
return courseService.getCourses();
|
||||
}
|
||||
|
||||
@GetMapping(path = "/{code}", produces = APPLICATION_JSON_UTF8_VALUE)
|
||||
public Course getCourse(@PathVariable String code) {
|
||||
return courseService.getCourse(code);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
package com.baeldung.restassured.learner;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
|
||||
|
||||
@ControllerAdvice(assignableTypes = CourseController.class)
|
||||
public class CourseControllerExceptionHandler extends ResponseEntityExceptionHandler {
|
||||
|
||||
@ResponseStatus(HttpStatus.NOT_FOUND)
|
||||
@ExceptionHandler(CourseNotFoundException.class)
|
||||
@SuppressWarnings("ThrowablePrintedToSystemOut")
|
||||
public void handleCourseNotFoundException(CourseNotFoundException cnfe) {
|
||||
System.out.println(cnfe);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package com.baeldung.restassured.learner;
|
||||
|
||||
class CourseNotFoundException extends RuntimeException {
|
||||
|
||||
CourseNotFoundException(String code) {
|
||||
super(code);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.baeldung.restassured.learner;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Service
|
||||
class CourseService {
|
||||
|
||||
private static final Map<String, Course> COURSE_MAP = new ConcurrentHashMap<>();
|
||||
|
||||
static {
|
||||
Course wizardry = new Course("Wizardry");
|
||||
COURSE_MAP.put(wizardry.getCode(), wizardry);
|
||||
}
|
||||
|
||||
Collection<Course> getCourses() {
|
||||
return COURSE_MAP.values();
|
||||
}
|
||||
|
||||
Course getCourse(String code) {
|
||||
return Optional.ofNullable(COURSE_MAP.get(code)).orElseThrow(() -> new CourseNotFoundException(code));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
package com.baeldung.restassured.learner;
|
||||
|
||||
import static io.restassured.module.mockmvc.RestAssuredMockMvc.given;
|
||||
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
|
||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
|
||||
|
||||
import org.junit.Before;
|
||||
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.test.context.junit4.SpringRunner;
|
||||
import org.springframework.web.context.WebApplicationContext;
|
||||
|
||||
import io.restassured.module.mockmvc.RestAssuredMockMvc;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = RANDOM_PORT)
|
||||
public class CourseControllerIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
private WebApplicationContext webApplicationContext;
|
||||
|
||||
@Before
|
||||
public void initialiseRestAssuredMockMvcWebApplicationContext() {
|
||||
RestAssuredMockMvc.webAppContextSetup(webApplicationContext);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNoMatchingCourseCodeWhenGetCourseThenRespondWithStatusNotFound() {
|
||||
String nonMatchingCourseCode = "nonMatchingCourseCode";
|
||||
|
||||
given()
|
||||
.when()
|
||||
.get("/courses/" + nonMatchingCourseCode)
|
||||
.then()
|
||||
.log().ifValidationFails()
|
||||
.statusCode(NOT_FOUND.value());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
package com.baeldung.restassured.learner;
|
||||
|
||||
import io.restassured.module.mockmvc.RestAssuredMockMvc;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.MockitoJUnitRunner;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import static io.restassured.http.ContentType.JSON;
|
||||
import static io.restassured.module.mockmvc.RestAssuredMockMvc.given;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.springframework.http.HttpStatus.NOT_FOUND;
|
||||
import static org.springframework.http.HttpStatus.OK;
|
||||
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class CourseControllerUnitTest {
|
||||
|
||||
@Mock
|
||||
private CourseService courseService;
|
||||
@InjectMocks
|
||||
private CourseController courseController;
|
||||
@InjectMocks
|
||||
private CourseControllerExceptionHandler courseControllerExceptionHandler;
|
||||
|
||||
@Before
|
||||
public void initialiseRestAssuredMockMvcStandalone() {
|
||||
RestAssuredMockMvc.standaloneSetup(courseController, courseControllerExceptionHandler);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNoExistingCoursesWhenGetCoursesThenRespondWithStatusOkAndEmptyArray() {
|
||||
when(courseService.getCourses()).thenReturn(Collections.emptyList());
|
||||
|
||||
given()
|
||||
.when()
|
||||
.get("/courses")
|
||||
.then()
|
||||
.log().ifValidationFails()
|
||||
.statusCode(OK.value())
|
||||
.contentType(JSON)
|
||||
.body(is(equalTo("[]")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenNoMatchingCoursesWhenGetCoursesThenRespondWithStatusNotFound() {
|
||||
String nonMatchingCourseCode = "nonMatchingCourseCode";
|
||||
|
||||
when(courseService.getCourse(nonMatchingCourseCode)).thenThrow(new CourseNotFoundException(nonMatchingCourseCode));
|
||||
|
||||
given()
|
||||
.when()
|
||||
.get("/courses/" + nonMatchingCourseCode)
|
||||
.then()
|
||||
.log().ifValidationFails()
|
||||
.statusCode(NOT_FOUND.value());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue