首页 > 解决方案 > 如何拦截放心响应验证失败

问题描述

放心,当我们这样做时

given().get("/api").then().statusCode(SC_OK).content(JSON);

抛出的错误总是顺序的,即如果状态码失败,它不会检查 contentType 是否为 JSON。

此外,抛出的错误总是, AssertionError (Expected : 200, Actual : 404) 无法从中理解,实际响应是什么,如果我们启用日志记录,它将打印在 STDOUT 上,但它不可用另一种方式。

有什么方法可以构建或设置类似我们如何实现的东西Filter,我们可以在请求构建时提供以在实际调用之前拦截设置

我有一个 rest api 框架,其中大多数验证都是使用ValidatableResponse ie完成.then()...;的,而不是通过在请求构建时创建响应的期望。

我希望截获特定类型的失败,即如果状态码失败是 50_ 而我们预期为 200 或其他任何内容,以便可以在测试失败原因中发布实际失败

我确实提出了 github 问题

但我不确定这是否会很快实施。我也无法在文档中找到任何内容。

标签: javajunitrest-assured

解决方案


我能够通过委托ResponseValidatableResponse接口实现来实现这一点

基本上

public class DelegateResponse implements Response {

  Response response;

  DelegateResponse(Response response){
    this.response = response;
  }
  .
  .
  .
  // Override and delegate other functions normally, but in the below call, delegate further

  @Override
  ValidatableResponse then(){
    return new DelegateValidatableResponse(response.then(), response);
  }

}

public class DelegateValidatableResponse implements ValidatableResponse {

  ValidatableResponse validatableResponse;
  Response response;

  DelegateValidatableResponse(ValidatableResponse validatableResponse,Response response) {
    this.validatableResponse = validatableResponse;
    this.response = response;
  }
  .
  .
  .
  // Override and delegate other functions similarly and wrap with try catch
  // This gives us access to Response object if an exception is thrown and we have more details
  // than just the String "Expected status code 200 but was 500"

  @Override
  public ValidatableResponse statusCode(Matcher<? super Integer> expectedStatusCode) {
    try {
      return validatableResponse.statusCode(expectedStatusCode);
    } catch (Throwable exception) {
      throw new ApiValidationError(response, requestSpec, responseSpec, exception);
    }
  }

}

推荐阅读