Rest Assured接口测试JUnit运行正常 Cucumber报Gson解析错误如何解决
异常原因及解决方案
核心原因定位
该错误本质是Gson尝试将字符串类型的内容解析为JSON对象时触发的类型不匹配异常,两段逻辑看起来一致但执行环境不同,触发原因集中在Cucumber与JUnit的运行环境差异上,常见原因如下:
- Cucumber环境Rest Assured配置不一致:JUnit用例加载的Rest Assured基础配置(baseURI、basePath、端口、解析器配置)和Cucumber启动时加载的配置不同,导致请求实际发送到了错误地址,返回了HTML错误页、纯文本错误提示等非JSON内容。
- 自动解析逻辑被提前触发:Cucumber上下文存在全局Hook(@BeforeStep/@AfterStep)、监听器,或者你使用的
CommonData.response是自定义的DTO实体类而非Rest Assured原生Response类型,赋值时会自动触发JSON序列化,此时如果响应内容不符合JSON结构就会报错。 - 默认解析器配置冲突:Cucumber测试启动类中强制配置了Gson作为全局默认解析器,且未处理非JSON响应的兼容逻辑。
分步解决方案
- 优先确认实际响应内容
在Cucumber步骤的请求执行后,先打印原始响应内容,确认是否返回了预期的JSON结构:
CommonData.response = given() .header("Authorization", PropertiesReader.getPropertiesValue("TokenPub")) .queryParam("langId", "PdOnv3OV") .queryParam("Regions", "52aAGOZ7") .queryParam("From","2022-01-30") .queryParam("To","2022-02-06") .when() .request(String.valueOf(RestHttpRequest.HttpMethods.GET), "/api/product/search"); // 新增调试代码 System.out.println("响应状态码:" + CommonData.response.getStatusCode()); System.out.println("原始响应内容:" + CommonData.response.getBody().asString());
如果打印出来的内容不是JSON(比如是<html>开头的错误页、404 Not Found之类的纯文本),直接修正Cucumber环境的Rest Assured baseURI、basePath配置即可。
- 统一两套环境的Rest Assured配置
将JUnit用例加载的Rest Assured配置迁移到Cucumber的全局前置Hook中,确保两套环境的请求基础配置完全一致,比如:
@Before public void initRestAssuredConfig() { RestAssured.baseURI = "你的接口域名"; RestAssured.basePath = "/你的基础路径"; // 其他配置保持和JUnit环境一致 }
- 避免自动解析触发异常
- 确认
CommonData.response的类型为io.restassured.response.Response,不要直接用自定义DTO类接收响应。 - 如果需要做实体转换,手动显式转换,避免框架自动解析:
String responseBody = CommonData.response.getBody().asString(); // 手动用Gson转换 SearchResponseDTO dto = new Gson().fromJson(responseBody, SearchResponseDTO.class);
- 兼容非JSON响应场景
如果有全局解析逻辑,先判断响应的Content-Type是否为JSON类型再执行解析:
String contentType = CommonData.response.getHeader("Content-Type"); if (contentType != null && contentType.contains("application/json")) { // 执行JSON解析逻辑 }
内容的提问来源于stack exchange,提问作者Qa Automation
相关产品推荐
相关产品推荐

