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
方法后才可用,这在基本代码中是无法做到的
我考虑过的解决这个问题的方法如下所述,但前两种方法相当笨拙,第三种方法可能完全错误,因为它会在“内部”子包中处理类。有没有“正确”的方法
- 添加一个基本方法
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();
}
}
- 使用一个接受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());
}
}
- 实例化
ResponseSpecificationImpl
的扩展实例(在RequestSpecificationImpl
和TestSpecificationImpl
中拖动)李>
# 1 楼答案
您可以使用
CookieFilter
来满足您的需要您可以通过两种方式使用此类:
有关更多信息: