【问题标题】:How to intercept rest-assured response validation failure如何拦截放心响应验证失败
【发布时间】:2020-02-10 16:30:56
【问题描述】:

放心,当我们这样做时

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

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

此外,抛出的错误始终是 AssertionError(预期:200,实际:404) 无法从中理解,实际响应是什么,如果我们启用日志记录,它将打印在 STDOUT 上,但其他任何方式都无法使用。

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

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

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

我确实加注了 github issue

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

【问题讨论】:

    标签: java junit rest-assured


    【解决方案1】:

    我能够通过委托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);
        }
      }
    
    }
    

    【讨论】:

    • 你能举例说明如何使用这些类吗?
    • 你基本上会在这些课程中捕捉到你的反应。 ` var response = new DelegateResponse(given().get("/my/url")); response.then().statusCode(200).contentType(JSON); ` 这些异常会失败,然后它们会抛出您定义的任何异常,并且您可以在异常类中添加更多数据,就像您在答案中看到的那样。然后,您可以定义异常的 toString 以打印您想要的任何内容。
    猜你喜欢
    • 2022-12-29
    • 1970-01-01
    • 2022-07-12
    • 2021-05-30
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多