У меня есть проекты для производителей и потребителей для тестирования Spring Cloud. У меня есть тестовые сценарии на основе сценариев успеха и сценарии на основе сценариев ошибок, которые работают нормально со стороны потребителя. Но для сценария ошибки вместо возврата настраиваемого отклика на ошибку и передачи контрольного примера на стороне потребителя в проекте потребителя возникает исключение. Хороший проект для обоих сценариев, созданный для сценария.
Боковой скрипт производителя:
Как видите, я передал недопустимое значение String для accountId в теле вместо значения Long.
Contract.make {
request {
method PUT()
urlPath("/api/v1/a")
headers {
contentType('application/json')
}
body("{\"accountId\": \"11332382Adg\" ,\"caseNumber\":\"CIS0005468\",\"representmentStartDate\":\"20181212\"}")
}
response {
status 400
headers {
contentType('application/json')
}
body([
"errorDescription": "invalid request or invalid date format"
])
}
}
Это ниже сгенерированный тестовый пример в целевых проходах.
Сгенерированный тестовый пример (это успех и прохождение) сторона производителя
public class Rap extends SRAP {
@Test
public void validate InvalidateRequest() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.header("Content-Type", "application/json")
.body("{\"accountId\":\"11332382Adg\",\"caseNumber\":\"CIS0005468\",\"representmentStartDate\":\"20181212\"}");
// when:
ResponseOptions response = given().spec(request)
.put("/api/v1/a");
// then:
assertThat(response.statusCode()).isEqualTo(400);
assertThat(response.header("Content-Type")).matches("application/json.*");
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).field("['errorDescription']").isEqualTo("invalid request or invalid date format");
}
}
Суперкласс Test, который расширяется подклассом, сгенерированным в target. Этот класс имеет ответ об ошибке, который я использую в тестовом примере, где всякий раз, когда вызывается исключение, я вызываю метод buildErrorResponse (), который будет вернуть настроенный ответ об ошибке.
`class SRAP{
public void setup() {
StandaloneMockMvcBuilder standaloneMockMvcBuilder = MockMvcBuilders.standaloneSetup(findCaseController, ApiController, controllerExceptionAdvice);
RestAssuredMockMvc.standaloneSetup(standaloneMockMvcBuilder);
when(controllerExceptionAdvice.handleHttpMessageNotReadable(any(), any(), any(), any()))
.thenReturn(
new ResponseEntity<>(
buildErrorResponse(),
HttpStatus.BAD_REQUEST
)
);
when(controllerExceptionAdvice.handleMethodArgumentTypeMismatchException(any(), any()))
.thenReturn(
new ResponseEntity<>(
buildErrorResponse(),
HttpStatus.BAD_REQUEST
)
);
private ErrorResponse buildErrorResponse() {
ErrorResponse errorResponse = ErrorResponse.builder().build();
errorResponse.setErrorDescription("invalid request or invalid date format");
return errorResponse;
}
}
успех на стороне потребителя. Тестовый пример:
@Test
public void should_update_case_success() throws Exception {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Type", "application/json");
ResponseEntity<String> response = restTemplate.exchange(
"http://localhost:8083/api/v1/a",
HttpMethod.PUT,
new HttpEntity<>("{\"accountId\":\"1112321\",\"caseNumber\":\"CIS1233\",\"representmentStartDate\":\"20181212\"}", httpHeaders), String.class);
BDDAssertions.then(response.getStatusCodeValue()).isEqualTo(200);
}
Потребительская сторона. Тестовый случай, который НЕВОЗМОЖЕН: я указал недопустимое значение для accountId, чтобы он завершился неудачно, и дал мне персонализированный ответ об ошибке
@Test
public void case_error() throws Exception {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Type", "application/json");
ResponseEntity<String> response = restTemplate.exchange(
"http://localhost:8083/api/v1/a",
HttpMethod.PUT,
new HttpEntity<>("{\"accountId\":\"11332382Adg\",\"caseNumber\":\"CIS0005468\",\"representmentStartDate\":\"20181212\"}", httpHeaders), String.class);
BDDAssertions.then(response.getStatusCodeValue()).isEqualTo(400);
System.out.println("response " + response.getBody());
BDDAssertions.then(response.getBody().equals("{\"errorDescription\":\"invalid request or invalid date format\"}"));
Даже в логах я получаю ответ, соответствующий Stubs-jar, но почему тестовый пример не проходит?:
Matched response definition:
{
"status" : 400,
"body" : "{\"errorDescription\":\"invalid request or invalid date format\"}",
"headers" : {
"Content-Type" : "application/json"
},
"transformers" : [ "response-template" ]
}
Response:
HTTP/1.1 400
Content-Type: [application/json]`
Случай проверки ошибок на стороне потребителя проходит только в том случае, если я прошел, но я должен получить настроенный ответ об ошибке
@Test(expected=HttpClientErrorException.class)
Ожидаемый результат: Должно быть возвращено настроенное тело ошибки и пройден контрольный пример.
{ errorDescription: invalid request or invalid date format }
Фактический результат: org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request