在Restassured中,我们可以通过不同的方式在body方法中传递请求有效载荷,如
字符串- <
- POJO对象/gh><
- 地图对象/gh>
- JsonObject(来自GSON库)
- 文件和
- FileInputStream
因此,我使用泛型创建了以下一个方法来容纳所有这些类型:-
public <T> Response postAMember(T body) {
return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn();
}
现在,这就是我如何为各自的类型消费它(不是一次全部…一次一个):-
@Test
public void postMember() throws IOException {
// Using Hashmap
Map<String, String> body = new HashMap<>();
body.put("name", "Rocky");
body.put("gender", "Male");
// Using Model and GSON
Member imember = new Member("Rocky", "Male");
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String body = gson.toJson(imember);
// Using JsonObject (GSON)
JsonObject body = new JsonObject();
body.addProperty("name", "Rocky");
body.addProperty("gender", "Male");
// Using Payload JSON File
File body = new File("src/test/resources/Payloads/postmemberpayload.json");
// Using Raw String
String body = "{rn" +
" "name": "Rocky",rn" +
" "gender": "Male"rn" +
"}";
// Using FileInputStream
FileInputStream fis = new FileInputStream(body); // in this case I would pass fis to body method
Response resp = MemberService.getMemberServiceInstance().postAMember(body);
Assert.assertEquals(resp.getStatusCode(), StatusCode.CREATED_201);
Member omember = resp.getBody().as(Member.class);
System.out.println(omember.toString());
}
postAMember方法只适用于:-
字符串- <
- POJO对象/gh><
- 地图对象/gh>
- JsonObject(来自GSON库)
但剩余两个失败:-
- File - Output is bad request 400
- FileInputStream -输出是java.lang.IllegalArgumentException: jdk.internal.ref.PhantomCleanable>声明多个JSON字段名为next
现在,我必须创建以下两个重载版本的postmember: -
public Response postAMember(File body) {
return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn();
}
public Response postAMember(FileInputStream body) {
return given().spec(this.spec).body(body).when().post(EndPoints.GET_ALL_POST_A_MEMBER).andReturn();
}
现在上面两个方法生成响应。知道这里出了什么问题吗?为什么泛型的方法不能采取文件和FileInputStream?
我已经从maven中央仓库中获取了最新的Restassured库。
据我所知,你的泛型方法将映射到RequestSpecification
的body(Object object)
,然后这个object
将被序列化。
class RequestSpecificationImpl
...
RequestSpecification body(Object object) {
...
this.requestBody = ObjectMapping.serialize(object, requestContentType,
findEncoderCharsetOrReturnDefault(requestContentType), null,
objectMappingConfig(), restAssuredConfig().getEncoderConfig());
...
}
下列所有类型的对象序列化都没有问题。
字符串- <
- POJO对象/gh><
- 地图对象/gh>
- JsonObject(来自GSON库)
,
- 文件序列化——比;文件 的完整路径
- FileInputStream序列化——比;exception (from Gson/Jackson)
当您添加2个方法时,则Rest-Assured正确映射到body(File body)
和body(InputStream body)
—>它们没有序列化——>没有问题。