Настроенный ответ об ошибке не возвращается для потребителя и выдает ошибку BAD REQUEST для тестов Spring Cloud Contract - PullRequest
1 голос
/ 09 мая 2019

У меня есть проекты для производителей и потребителей для тестирования 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...