DeletePlace请求200成功但无响应体,Utils类第47行报错求助
问题分析与解决方案
问题详情
验证DeletePlace请求的响应体"status": "OK"时触发异常:
- 请求返回200状态码,但日志文件中无响应体内容
- 控制台报错定位到Utils类第47行(
return js.get(key).toString();)
相关代码
package resources; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.Properties; import io.restassured.RestAssured; import io.restassured.builder.RequestSpecBuilder; import io.restassured.filter.log.RequestLoggingFilter; import io.restassured.filter.log.ResponseLoggingFilter; import io.restassured.http.ContentType; import io.restassured.path.json.JsonPath; import io.restassured.response.Response; import io.restassured.specification.RequestSpecification; public class Utils { public static RequestSpecification req; public RequestSpecification requestSpecification() throws IOException { if (req==null) { PrintStream log = new PrintStream(new FileOutputStream("logging.txt")); req = new RequestSpecBuilder().setBaseUri(getGlobalValue("baseUrl")).addQueryParam("key", "qaclick123") .addFilter(RequestLoggingFilter.logRequestTo(log)) .addFilter(ResponseLoggingFilter.logResponseTo(log)) .setContentType(ContentType.JSON).build(); return req; } return req; } public static String getGlobalValue(String key) throws IOException { Properties prop = new Properties(); FileInputStream fis = new FileInputStream("E:\\Eclipse-Workspace\\RestAssuredAPIFramework\\src\\test\\java\\resources\\global.properties"); prop.load(fis); return prop.getProperty(key); } public String getJsonPath(Response response, String key) { String resp = response.asString(); JsonPath js = new JsonPath(resp); return js.get(key).toString(); //Error line } }
核心原因
- 响应体为空:部分Delete接口在执行成功(返回200)时不会返回任何响应体,此时
response.asString()会得到空字符串,JsonPath解析空内容时无法找到"status"字段,返回null后调用toString()触发空指针异常。 - 日志未记录空响应体:ResponseLoggingFilter默认可能不记录空响应体,导致日志文件中无相关内容。
解决方案
1. 修复getJsonPath方法,处理空响应体与null值
修改Utils类的getJsonPath方法,增加空值判断,避免空指针:
public String getJsonPath(Response response, String key) { String resp = response.asString(); // 先判断响应体是否为空或空白字符 if (resp == null || resp.trim().isEmpty()) { return null; // 或返回空字符串,根据测试需求调整 } JsonPath js = new JsonPath(resp); Object value = js.get(key); // 处理字段不存在导致的null值 return value != null ? value.toString() : null; }
2. 调整测试逻辑,适配空响应体场景
在测试代码中,先判断响应体是否存在,再选择验证方式:
// 执行DeletePlace请求 Response deleteResponse = given().spec(utils.requestSpecification()) .body(deletePayload) .when().delete("/maps/api/place/delete/json") .then().extract().response(); // 优先验证状态码,再根据响应体是否存在验证status字段 Assert.assertEquals(deleteResponse.getStatusCode(), 200); String responseBody = deleteResponse.getBody().asString().trim(); if (!responseBody.isEmpty()) { String status = utils.getJsonPath(deleteResponse, "status"); Assert.assertEquals(status, "OK"); }
3. 确保空响应体被日志记录
修改日志输出逻辑,强制记录空响应体:
// 在requestSpecification方法中,自定义响应日志过滤器,确保空响应体被记录 ResponseLoggingFilter customResponseFilter = ResponseLoggingFilter.responseLogger() .logStatusCode() .logStatusLine() .logHeaders() .logBody(LogDetail.ALL); req = new RequestSpecBuilder().setBaseUri(getGlobalValue("baseUrl")).addQueryParam("key", "qaclick123") .addFilter(RequestLoggingFilter.logRequestTo(log)) .addFilter(customResponseFilter) .setContentType(ContentType.JSON).build();
内容的提问来源于stack exchange,提问作者deepak thakur
相关产品推荐
相关产品推荐

