使用泛型放心传递正文不适用于 File 和 FileInputStream

Passing body in restassured using Generics doesn't work for File and FileInputStream

在 Restassured 中,我们可以通过不同的方式在 body 方法中传递请求负载,例如

  1. 字符串
  2. POJO 对象
  3. 地图对象
  4. JsonObject(来自 GSON 库)
  5. 文件和
  6. 文件输入流

因此,我创建了以下一种使用泛型来适应所有这些类型的方法:-

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 方法仅适用于:-

  1. 字符串
  2. POJO 对象
  3. 地图对象
  4. JsonObject(来自 GSON 库)

但失败了剩下的两个:-

  1. 文件 - 输出错误请求 400
  2. 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 库。

据我了解,您的泛型方法将映射到 RequestSpecificationbody(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) --> 它们没有序列化 --> 没问题。