Scenario: Attempt to track progress for non-enrolled course
Given a student is not enrolled in the course
When the student attempts to update lecture progress
Then the progress update should fail with status code 422
And the error message should contain "ENROLLMENT_NOT_FOUND"
< /code>
Определения шага (.java):
Тест не удается внутри метода thestudentupdateslectureprescresstopercent, который отправляет запрос PUT. < /p>
import static io.restassured.RestAssured.given;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import java.util.UUID;
// Class-level fields
private Response response;
private RequestSpecification trainingRequestSpec;
@When("the student updates lecture progress to {double} percent")
public void theStudentUpdatesLectureProgressToPercent(double percentage) {
var progressRequest = TestDataFactory.createProgressUpdateRequest(percentage);
String nonExistentEnrollmentId = UUID.randomUUID().toString();
//
response = given()
.spec(trainingRequestSpec)
.body(progressRequest)
.when()
.put("/api/v1/enrollments/" + nonExistentEnrollmentId + "/progress");
}
@Then("the progress update should fail with status code {int}")
public void theProgressUpdateShouldFailWithStatusCode(int expectedStatusCode) {
response.then().statusCode(expectedStatusCode);
}
< /code>
То, что я пробовал (но не работал): < /p>
Использование .Then (). Extract (). response (): Это наиболее распространенное решение, рекомендованное для этой проблемы, но это не работает для меня. Исключение брошено до того, как блок .Then () когда -либо выполняется. < /P>
response = given()
// ...
.when()
.put(...)
.then()
.extract().response(); // The exception still occurs
< /code>
2- Использование .log (). All () для отладки: это подтверждает, что проблема возникает сразу после отправки запроса. Журнал запросов печатается успешно, но не напечатан журнал ответов, так как тест выносится до этого. < /P>
Request method: PUT
Request URI: http://localhost:8080/api/v1/enrollments/...
...
Headers: Accept=*/*
Content-Type=application/json
Body:
{ ... }
// NO RESPONSE LOG IS PRINTED HERE
io.restassured.internal.http.HttpResponseException: status code: 422
at io.restassured.internal.RequestSpecificationImpl.put(RequestSpecificationImpl.groovy:...)
...
< /code>
Использование блоков Try-Catch: я смог поймать httpresponseexception. Тем не менее, попытка восстановить полезный объект ответа из исключения, чтобы позволить jsonpath () работать в последующих этапах, что привело к нулевой точке зрения, поскольку реконструированный объект не имеет необходимой внутренней конфигурации (например, ObjectMapperConfig).
Проверка базовой конфигурации: моя базовая задача очень проста, содержащей только базовую URI и контент. Он не включает в себя какую -либо ожидаемое statuscode () или ответное разрешение, которое может мешать проверке ответа. < /P>
My pom.xml Dependencies:
rest-assured: 5.3.2
cucumber-java: 7.14.0
junit-jupiter-api: 5.10.0
< /code>
Мой основной вопрос:
Что такое окончательный, надежный способ предотвращения отказа от выброса httpresponseexexception в ответ 4xx /5xx, что позволяет коду перейти к блоку () для проверки? Почему стандарт .then (). Extract (). Решение ответа () не работает в этом конкретном случае, и какую альтернативную стратегию я должен использовать?
Подробнее здесь: https://stackoverflow.com/questions/797 ... instead-of