问题描述:
rest-assured -使用response.path(“xxx”).toString()方法报错
报错信息如下:
java.lang.IllegalStateException: Cannot determine which path implementation to use because the content-type text/plain;charset=UTF-8 doesn't map to a path implementation.
at io.restassured.internal.RestAssuredResponseOptionsGroovyImpl.path(RestAssuredResponseOptionsGroovyImpl.groovy:402)
at io.restassured.internal.RestAssuredResponseOptionsImpl.path(RestAssuredResponseOptionsImpl.java:200)
at com.dongao.DaQsAiTest.MyTest.test1(MyTest.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
经过百度、谷歌都没有搜到正确答案,于是自己查看源码
RestAssuredResponseOptionsGroovyImpl.groovy 查看这个文件里
这个文件内,发现返回消息体格式为:content-type text/plain;charset=UTF-8 ,而text 在这段源码里是不存在的,所以抛了异常,找到了报错所在,就可以解决问题了。
解决方案
解决方案有2种,最终的目的就是将返回消息变为json格式即可
方法一:通过restassured提供的json解析的from静态方法转换response为json格式
import static io.restassured.path.json.JsonPath.from;
@Test
void test1(){
query.put("userExtendId","2079");
query.put("userId","1879");
String response = given().contentType("application/json").log().all().queryParams(query).request("get", "your api url ")
.then().log().all()
.extract().asString();
HashMap obj=from(response).get("obj");
方法二:使用 ResponseBuilder重构response,修改ContentType,创建一个新的response,
import io.restassured.builder.ResponseBuilder;
@Test
void test1(){
query.put("userExtendId","2079");
query.put("userId","1879");
Response response = given().log().all().queryParams(query).request("get", "http://qs.api.test.com/studyApi/study/V3/index")
.then().log().all()
.extract().response();
ResponseBuilder responseBuilder=new ResponseBuilder().clone(response);
responseBuilder.setContentType("application/json; charset=UTF-8");
Response finalresponse=responseBuilder.build();
HashMap obj=finalresponse.path("obj");
备注:如果所有的测试用例都有这个问题,在@BeforeAll 增加filter,在filter里增加对response的处理
@BeforeAll
static void beforeAll(){
RestAssured.filters((req, res, ctx)->{
Response originalResponse=ctx.next(req,res);
ResponseBuilder responseBuilder=new ResponseBuilder().clone(originalResponse);
responseBuilder.setContentType("application/json; charset=UTF-8");
return responseBuilder.build();
});
}