当前位置: 首页 > 知识库问答 >
问题:

如何对传入的Jersey多部分请求进行单元测试处理

施海
2023-03-14

我们有一个 REST 服务,它接受包含保存 InputStream 的 BodyPartsMultiPart POST 请求。在 REST 服务中,可能会根据提供的数据创建一个文件。

我们希望对基于其<code>多部分

然而,问题在于从REST客户端发送的MultiPart与REST服务器接收的MultiPart不同,因为球衣可能会对数据进行一些处理以对其进行流式传输或其他操作。尝试测试(见下文)以下设置将导致

IllegalArgumentException [B cannot be cast to com.sun.jersey.multipart.BodyPartEntity

(只是片段,我省略了显而易见的东西):

    byte[] bytes = FileManager.readImageFileToArray(completePath, fileType);

    MultiPart multiPart = new MultiPart().
            bodyPart(new BodyPart(bytes, MediaType.APPLICATION_OCTET_STREAM_TYPE)).
            bodyPart(new BodyPart(fileName, MediaType.APPLICATION_XML_TYPE)).
            bodyPart(new BodyPart(senderId, MediaType.APPLICATION_XML_TYPE));

    ClientConfig cc = new DefaultClientConfig();
    cc.getClasses().add(MultiPartWriter.class);
    Client client = Client.create(cc);
    WebResource webResource = client.resource(requestUrl);
    Builder builder = webResource.type(MediaType.MULTIPART_FORM_DATA_TYPE);
    builder = addHeaderParams(builder, headerParams);

    ClientResponse response = builder.post(ClientResponse.class, multiPart);

Rest:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@Transactional
public Response create(MultiPart multiPart) {

    try {
            multiPartReader.saveFile(multiPart);

服务器端MultiPartReader从multipart保存文件

public class MultiPartReader {

    public void saveFile(MultiPart multiPart) throws IOException {

        BodyPartEntity bpe = (BodyPartEntity) multiPart.getBodyParts().get(0).getEntity();
        InputStream inputStream = bpe.getInputStream();

        // ...

        BufferedImage bi = ImageIO.read(inputStream);
        String fileName = getFileNameFromMultiPart(multiPart);

        File file = new File(filename);

        if (file.isDirectory()) {
            ImageIO.write(bi, formatName, file);
        } else {
            file.mkdirs();
            ImageIO.write(bi, formatName, file);
        }

        bpe.close();
    }

现在我想测试MultiPartReader:

@Test
public void saveFile_should_Create_file() throws IOException {
    byte[] bytes = IOUtils.toByteArray(this.getClass().getResourceAsStream(fileResource));

    MultiPart multiPart = new MultiPart().
            bodyPart(new BodyPart(bytes, MediaType.APPLICATION_OCTET_STREAM_TYPE)).
            bodyPart(new BodyPart(fileName, MediaType.APPLICATION_XML_TYPE)).
            bodyPart(new BodyPart(senderId, MediaType.APPLICATION_XML_TYPE));
     
    multiPartReader.saveFile(multiPart);

    file = new File(fileName);
    Assert.assertNotNull(file);
    Assert.assertTrue(file.getTotalSpace() > 0);
    file.delete();
}

但是,就像我说的,我得到了

IllegalArgumentException [B cannot be cast to com.sun.jersey.multipart.BodyPartEntity

    BodyPartEntity bpe = (BodyPartEntity) multiPart.getBodyParts().get(0).getEntity();

那么,我可以做些什么来模拟jersey处理的发送/接收,以便我的测试将获得与我的REST服务部署在服务器上并由REST客户端请求的相同数据?

使用

BodyPartEntity bpe = multiPart.getBodyParts().get(0).getEntityAs(BodyPartEntity.class);

会抛出一个

IllegalStateException: Entity instance does not contain the unconverted content

我认为,进一步的指针是,在调用我的MultiPartReader之前,必须以某种方式转换测试生成的MultiPart。

jersey中必须有某种方法,我可以调用它,当它在已部署的系统上发送多部分请求时,或者可能是接收端在接收HTTP请求时进行一些解析时,它会像它那样进行转换。。?

共有1个答案

勾学博
2023-03-14

看着泽西的多部分文件,我看到:

“目前不可能提前知道应用程序会对每个单独的身体部分使用什么Java类,因此无法选择合适的提供者。目前,每个BodyPart的未解析内容在返回的BodyPart}实例的entity属性中返回(作为字节数组),应用程序可以根据该body part中包含的头来决定需要采取哪些进一步的步骤。最简单的技术是检查接收到的BodyPart,一旦知道自己喜欢哪个实现类,就调用getEntityAs()方法。

看起来你需要遵循那个建议。检查服务器端MultiPartReader代码中返回的字节数组:

multiPart.getBodyParts().get(0).getEntity();

...并在 BodyPart 上调用 getEntityAs()。

 类似资料:
  • 问题内容: 我有以下用于保存汽车的请求处理程序。我已经验证了使用cURL时的效果。现在,我想使用Spring MVC Test对方法进行单元测试。我试图使用fileUploader,但是我无法使其正常运行。我也无法添加JSON部分。 如何使用Spring MVC Test对该方法进行单元测试?我无法在此找到任何示例。 我想为自己的auto +一个或多个文件添加JSON表示形式。 问题答案: 由于已

  • 问题内容: 我正在使用Spring-Jersey3,无法弄清楚如何使用Spring Bean对RESTFul API进行单元测试 Controller Service Interface Service Implementation ResourceRegister.java (Jersey resource register) web.xml serviceContext.xml(Applica

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 我定义了下一个单元测试来测试用于上传文件的控制器: 为什么我在考试中得了400分?我是不是错过了测试中的某些配置?

  • 问题内容: 我一直在学习AngularJS,并且在单元测试方面进展非常顺利,但是我遇到了一个棘手的问题。 假设我有一个简单的表格,例如: 如果我正在测试类似控制器的东西,我知道我会这样写(使用Jasmine + Karma): 但是我不知道我需要注入哪些服务,也没有运气在指南或文档中找到有关单元测试的文档。 一个单元如何在Angular中测试表单? 问题答案: 我不认为这是对此类内容进行单元测试的

  • 本文向大家介绍对Angular.js Controller如何进行单元测试,包括了对Angular.js Controller如何进行单元测试的使用技巧和注意事项,需要的朋友参考一下 一、写个简单的Angular App 在开始写测试之前,我们先写一个简单的计算App,它会计算两个数字之和。 代码如下: 二、简单说说里面涉及的一些基本概念: 创建一个 module 什么是angular.modul