使用Rest Assured自动化Post API时Eclipse出现黄色高亮错误及500状态码
解决Rest Assured Post API测试的两个问题:类型安全警告与500状态码错误
一、类型安全警告问题
问题描述
Eclipse中代码出现黄色高亮警告:Type safety: The method put(Object, Object) belongs to the raw type HashMap. References to generic type HashMap<K,V> should be parameterized
原因
你使用的org.json.simple.JSONObject底层基于原始类型的HashMap实现,未指定泛型参数<K,V>,因此Java编译器抛出类型安全警告。
解决方法
有两种常用方案:
替换为带泛型支持的JSON库
改用Java原生的org.json.JSONObject(或Jackson/Gson的JSON对象),这类库的put方法支持泛型,从根源消除警告。
若用Maven,可添加依赖:<dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20240303</version> </dependency>代码中导入改为:
import org.json.JSONObject;临时抑制警告
若不想更换库,可在方法上添加注解屏蔽警告:@SuppressWarnings("unchecked") @Test public void createBooking() { // 原代码逻辑 }
二、500状态码错误问题
问题描述
调用Post接口返回500状态码,而非预期的200/201
原因
请求JSON存在3处错误,导致后端解析失败抛出异常:
- 嵌套对象传递错误:
booking.put("bookingdates", "bookingdates");传入的是字符串"bookingdates",而非创建的bookingdatesJSONObject对象。 - 数据类型不匹配:
totalprice应为数字类型,你传了字符串"1000";depositpaid应为布尔类型,你传了字符串"true",后端无法正确解析这些类型。
解决方法
修正请求参数的类型和嵌套对象传递:
package com.testautomation.apitesting; import org.json.JSONObject; // 替换为带泛型的JSON库 import org.testng.annotations.Test; import io.restassured.RestAssured; import io.restassured.http.ContentType; public class PostAPIRequest { @SuppressWarnings("unchecked") // 若用json-simple则加此注解,用org.json可省略 @Test public void createBooking() { JSONObject booking = new JSONObject(); JSONObject bookingdates = new JSONObject(); // 修正数据类型:totalprice用整数,depositpaid用布尔值 booking.put("firstname", "Garima"); booking.put("lastname", "Nandal"); booking.put("totalprice", 1000); // 改为整数 booking.put("depositpaid", true); // 改为布尔值 booking.put("additionalneeds", "Breakfast"); booking.put("bookingdates", bookingdates); // 传入对象而非字符串 bookingdates.put("checkin", "2024-06-26"); bookingdates.put("checkout", "2024-06-27"); RestAssured .given() .contentType(ContentType.JSON) .body(booking.toString()) .baseUri("https://restful-booker.herokuapp.com/booking") .when() .post() .then() .assertThat() .statusCode(200); // restful-booker创建成功返回200,部分接口可能返回201 } }
验证说明
修正后,请求JSON结构符合接口要求:
{ "firstname": "Garima", "lastname": "Nandal", "totalprice": 1000, "depositpaid": true, "additionalneeds": "Breakfast", "bookingdates": { "checkin": "2024-06-26", "checkout": "2024-06-27" } }
此时后端能正确解析请求,返回预期的200状态码。
内容的提问来源于stack exchange,提问作者Garima Yadav
相关产品推荐
相关产品推荐

