有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用公共代码从放心响应中提取cookie

使用REST-Assured(来自Java的4.3.3),我可以在一个基本测试类中自由地操作请求和响应规范对象,这样当实际测试需要一个请求规范来执行实际调用时,它就可以使用某些公共语句进行“预配置”。例如:

public abstract class TestBase
    protected RequestSpecification request() {
        return given()
                .cookies(globalCookies)
                .port(serverPort)
                .log().ifValidationFails()
                .then()
                .log().ifValidationFails()
                .given();
    }
}
public class ActualTest extends TestBase {
  @Test
  public void test1() {
    String content = request().get("/some").then()
           .statusCode(200)
           .extract()
           .body().asString();
  }
}

我现在想做的是“预配置”规范,以在请求之间保留cookie。我正在使用RequestSpecification.cookies(Cookies)提供要发送的cookie列表,但是在获取Response的实例之前,我找不到任何方法来指示规范提取返回的cookie。然而,这样的实例只有在调用一个RequestSender方法后才可用,这在基本代码中是无法做到的

我考虑过的解决这个问题的方法如下所述,但前两种方法相当笨拙,第三种方法可能完全错误,因为它会在“内部”子包中处理类。有没有“正确”的方法

  1. 添加一个基本方法saveCookies(),该方法接受ValidatableResponse的实例,它可以在该实例上调用extract(),并获取cookie。然后每个测试都必须使用该方法
public abstract class TestBase
  // ...
  protected ValidatableResponse saveCookies(ValidatableResponse r) {
    saveGlobalCookies(r.extract().detailedCookies());
    return r;
  }
}
public class ActualTest extends TestBase {
  @Test
  public void test1() {
    String content = saveCookies(request().get("/some").then())
           .statusCode(200)
           .extract()
           .body().asString();
  }
}
  1. 使用一个接受lambda的基本方法,这样就可以拦截可能的中间ValidatableResponse,并将最终结果(如果需要)返回给调用程序
public abstract class TestBase
  // ...
  <T> T cookieRequest(Function<RequestSender, ValidatableResponse> exec, Function<ValidatableResponse, T> post) {

        ValidatableResponse vr = exec.apply(request());
        saveGlobalCookies(vr.extract().detailedCookies());
        return post.apply(vr);

    }
}
public class ActualTest extends TestBase {
  @Test
  public void test1() {
    String content = cookieRequest(r->r.get("/some").then(),
       r->r.extract().body().asString());
  }
}
  1. 实例化ResponseSpecificationImpl的扩展实例(在RequestSpecificationImplTestSpecificationImpl中拖动)

共 (1) 个答案

  1. # 1 楼答案

    您可以使用CookieFilter来满足您的需要

    The cookie filter can be used to keep track of all the cookies sent by the server and use them in subsequent requests

    您可以通过两种方式使用此类:

    1. 静态设置:
    RestAssured.filters(new CookieFilter());
    
    1. 为所需的请求指定:
    CookieFilter cookieFilter = new CookieFilter();
    
    //Request 1  
    given().filter(cookieFilter).get("/x");
    
    //Request 2
    given().filter(cookieFilter).get("/y");
    

    有关更多信息: