使用泛型放心传递正文不适用于 File 和 FileInputStream
Passing body in restassured using Generics doesn't work for File and FileInputStream
在 Restassured 中,我们可以通过不同的方式在 body 方法中传递请求负载,例如
- 字符串
- POJO 对象
- 地图对象
- JsonObject(来自 GSON 库)
- 文件和
- 文件输入流
因此,我创建了以下一种使用泛型来适应所有这些类型的方法:-
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 = "{\r\n" +
" \"name\": \"Rocky\",\r\n" +
" \"gender\": \"Male\"\r\n" +
"}";
// 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 对象
- 地图对象
- JsonObject(来自 GSON 库)
但失败了剩下的两个:-
- 文件 - 输出错误请求 400
- FileInputStream - 输出为 java.lang.IllegalArgumentException:jdk.internal.ref.PhantomCleanable> 声明多个 JSON 字段命名为 next
现在我必须制作以下两个更重载的 postAMember 版本:-
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();
}
现在以上两种方法生成响应。知道这里出了什么问题吗?为什么使用泛型的方法无法获取 File 和 FileInputStream?
我已经从 maven central repo 获取了最新的 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 对象
- 地图对象
- JsonObject(来自 GSON 库)
但是
- 文件---序列化---> FILE的完整路径
- FileInputStream ---序列化--->异常(来自Gson/Jackson)
当您添加 2 个方法时,Rest-Assured 会正确映射到 body(File body)
和 body(InputStream body)
--> 它们没有序列化 --> 没问题。
在 Restassured 中,我们可以通过不同的方式在 body 方法中传递请求负载,例如
- 字符串
- POJO 对象
- 地图对象
- JsonObject(来自 GSON 库)
- 文件和
- 文件输入流
因此,我创建了以下一种使用泛型来适应所有这些类型的方法:-
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 = "{\r\n" +
" \"name\": \"Rocky\",\r\n" +
" \"gender\": \"Male\"\r\n" +
"}";
// 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 对象
- 地图对象
- JsonObject(来自 GSON 库)
但失败了剩下的两个:-
- 文件 - 输出错误请求 400
- FileInputStream - 输出为 java.lang.IllegalArgumentException:jdk.internal.ref.PhantomCleanable> 声明多个 JSON 字段命名为 next
现在我必须制作以下两个更重载的 postAMember 版本:-
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();
}
现在以上两种方法生成响应。知道这里出了什么问题吗?为什么使用泛型的方法无法获取 File 和 FileInputStream?
我已经从 maven central repo 获取了最新的 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 对象
- 地图对象
- JsonObject(来自 GSON 库)
但是
- 文件---序列化---> FILE的完整路径
- FileInputStream ---序列化--->异常(来自Gson/Jackson)
当您添加 2 个方法时,Rest-Assured 会正确映射到 body(File body)
和 body(InputStream body)
--> 它们没有序列化 --> 没问题。