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

RESTful Webservice与Spring mvc的图像上传集成测试

汲睿
2023-03-14

如何编写集成测试时,我上传图像到服务器。我已经在这个问题之后写了一个测试,它的答案,但我的工作不正常。我使用JSON发送图像和预期状态确定。但是我得到:

组织。springframework。网状物乌蒂尔。NestedServletException:请求处理失败;嵌套的异常是java。狭义辩论

或超文本传输协议状态400或415。我猜意思是一样的。下面我给出了我的测试部分和控制器类部分。

测试部分:

@Test
public void updateAccountImage() throws Exception{
    Account updateAccount = new Account();
    updateAccount.setPassword("test");
    updateAccount.setNamefirst("test");
    updateAccount.setNamelast("test");
    updateAccount.setEmail("test");
    updateAccount.setCity("test");
    updateAccount.setCountry("test");
    updateAccount.setAbout("test");
    BufferedImage img;
    img = ImageIO.read(new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg"));
    WritableRaster raster = img .getRaster();
    DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();
    byte[] testImage = data.getData();
    updateAccount.setImage(testImage);

    when(service.updateAccountImage(any(Account.class))).thenReturn(
            updateAccount);

    MockMultipartFile image = new MockMultipartFile("image", "", "application/json", "{\"image\": \"C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg\"}".getBytes());

    mockMvc.perform(
            MockMvcRequestBuilders.fileUpload("/accounts/test/updateImage")
                    .file(image))
            .andDo(print())
            .andExpect(status().isOk());

}

控制器部分:

@RequestMapping(value = "/accounts/{username}/updateImage", method = RequestMethod.POST)
public ResponseEntity<AccountResource> updateAccountImage(@PathVariable("username") String username,
        @RequestParam(value="image", required = false) MultipartFile image) {
    AccountResource resource =new AccountResource();

      if (!image.isEmpty()) {
                    try {
                        resource.setImage(image.getBytes());
                        resource.setUsername(username);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
        }
    Account account = accountService.updateAccountImage(resource.toAccount());
    if (account != null) {
        AccountResource res = new AccountResourceAsm().toResource(account);
        return new ResponseEntity<AccountResource>(res, HttpStatus.OK);
    } else {
        return new ResponseEntity<AccountResource>(HttpStatus.EXPECTATION_FAILED);
    }
}

若我以这种方式编写控制器,它在Junit跟踪中显示IllegalArgument,但在控制台中并没有问题,也并没有模拟打印。因此,我将控制器替换为:

    @RequestMapping(value = "/accounts/{username}/updateImage", method = RequestMethod.POST)
    public ResponseEntity<AccountResource> updateAccountImage(@PathVariable("username") String username,
            @RequestBody AccountResource resource) {
        resource.setUsername(username);
        Account account = accountService.updateAccountImage(resource.toAccount());
        if (account != null) {
            AccountResource res = new AccountResourceAsm().toResource(account);
            return new ResponseEntity<AccountResource>(res, HttpStatus.OK);
        } else {
            return new ResponseEntity<AccountResource>(HttpStatus.EXPECTATION_FAILED);
        }
    }

比我有这个输出在控制台:

MockHttpServletRequest:
         HTTP Method = POST
         Request URI = /accounts/test/updateImage
          Parameters = {}
             Headers = {Content-Type=[multipart/form-data;boundary=265001916915724]}

             Handler:
                Type = web.rest.mvc.AccountController
              Method = public org.springframework.http.ResponseEntity<web.rest.resources.AccountResource> web.rest.mvc.AccountController.updateAccountImage(java.lang.String,web.rest.resources.AccountResource)

               Async:
   Was async started = false
        Async result = null

  Resolved Exception:
                Type = org.springframework.web.HttpMediaTypeNotSupportedException

        ModelAndView:
           View name = null
                View = null
               Model = null

            FlashMap:

MockHttpServletResponse:
              Status = 415
       Error message = null
             Headers = {Accept=[application/octet-stream, text/plain;charset=ISO-8859-1, application/xml, text/xml, application/x-www-form-urlencoded, application/*+xml, multipart/form-data, application/json;charset=UTF-8, application/*+json;charset=UTF-8, */*]}
        Content type = null
                Body = 
       Forwarded URL = null
      Redirected URL = null
             Cookies = []

现在,我需要知道如何解决这个问题,或者我应该采取另一种方法,这是什么。

共有2个答案

冀永寿
2023-03-14

我可以使用apache来测试这一点。平民httpClient库,如下所示

@Test
public void testUpload() {

    int statusCode = 0;
    String methodResult = null;

    String endpoint = SERVICE_HOST + "/upload/photo";

    PostMethod post = new PostMethod(endpoint);

    File file = new File("/home/me/Desktop/someFolder/image.jpg");

    FileRequestEntity entity = new FileRequestEntity(file, "multipart/form-data");

    post.setRequestEntity(entity);

    try {
        httpClient.executeMethod(post);
        methodResult = post.getResponseBodyAsString();
    } catch (HttpException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    statusCode = post.getStatusCode();

    post.releaseConnection();
        //...
}
章昱
2023-03-14

问题是因为控制器类旨在接收多部分/表单数据,但发送JSON数据。这段代码还有一个问题。控制器返回内部具有图像的资源。导致处理失败。下面给出了正确的代码:

@测试部分

        Account updateAccount = new Account();
        updateAccount.setPassword("test");
        updateAccount.setNamefirst("test");
        updateAccount.setNamelast("test");
        updateAccount.setEmail("test");
        updateAccount.setCity("test");
        updateAccount.setCountry("test");
        updateAccount.setAbout("test");
        BufferedImage img;
        img = ImageIO.read(new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg"));
        WritableRaster raster = img .getRaster();
        DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();
        byte[] testImage = data.getData();
        updateAccount.setImage(testImage);

        FileInputStream fis = new FileInputStream("C:\\Users\\Public\\Pictures\\Sample Pictures\\Penguins.jpg");
        MockMultipartFile image = new MockMultipartFile("image", fis);


          HashMap<String, String> contentTypeParams = new HashMap<String, String>();
        contentTypeParams.put("boundary", "265001916915724");
        MediaType mediaType = new MediaType("multipart", "form-data", contentTypeParams);

        when(service.updateAccountImage(any(Account.class))).thenReturn(
                updateAccount);
        mockMvc.perform(
                MockMvcRequestBuilders.fileUpload("/accounts/test/updateImage")
                .file(image)        
                    .contentType(mediaType))
                .andDo(print())
                .andExpect(status().isOk());

控制器部分:

@RequestMapping(value = "/{username}/updateImage", method = RequestMethod.POST)
public @ResponseBody
ResponseEntity<AccountResource> updateAccountImage(@PathVariable("username") String username,
            @RequestParam("image") final MultipartFile file)throws IOException {


    AccountResource resource =new AccountResource();
                        resource.setImage(file.getBytes());
                        resource.setUsername(username);


    Account account = accountService.updateAccountImage(resource.toAccount());
    if (account != null) {
        AccountResource res = new AccountResourceAsm().toResource(account);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.TEXT_PLAIN);
        return new ResponseEntity<AccountResource>(res,headers, HttpStatus.OK);
    } else {
        return new ResponseEntity<AccountResource>(HttpStatus.NO_CONTENT);
    }
}
 类似资料:
  • 我正在通过在线示例学习使用FreeMarker的SpringMVC。我遇到了这个错误,但是我不知道我的getFreemarkerConfig()方法有什么问题,一整天我都在试图修复它,但是没有成功。

  • 本文向大家介绍SpringMVC上传图片与访问,包括了SpringMVC上传图片与访问的使用技巧和注意事项,需要的朋友参考一下 关于springmvc上传图片的方法小编给大家整理了两种方法,具体内容如下所示: 第一种:(放在该项目下的物理地址对应的位置) a. 路径写法: String basePath="/WEB-INF/resources/upload"; String filePathNam

  • 我的样本代码在这里 尝试运行junit测试时,收到以下错误消息。 JAVAlang.IllegalStateException:未能加载ApplicationContext 原因:org。springframework。豆。工厂BeanCreationException:创建名为“nameDao”的bean时出错:调用init方法失败;嵌套的异常是java。lang.IllegalArgument

  • 目前,我的应用程序使用SpringMVC进行所有控制器映射。我正在尝试实现一个tinyMCE拼写检查,它包括一个Servlet,我不确定如何在不修改该文件本身的情况下正确集成该Servlet。我想避免修改,这样如果我们以后有新版本,我们就可以了。 Servlet看起来像...

  • 本文向大家介绍SpringMVC框架实现图片上传与下载,包括了SpringMVC框架实现图片上传与下载的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了SpringMVC框架实现图片上传与下载的具体代码,供大家参考,具体内容如下 1、新建一个Maven webapp项目,引入需要用的夹包,pom.xml文件的依赖包如下: 2、配置文件设置如下: (1) web.xml内容为: (2)s

  • 我试图理解Spring MVC Restful架构。想知道有多少种方法可以将SpringMVC与RESTfulWeb服务集成在一起。我可以看到其中一个是使用Rest模板。 这是在Spring MVC中使用rest Web服务的唯一方法吗? 我们可以单独使用SpringMVC开发web应用程序而不使用任何web服务吗。 如果我说错了,请指正。 谢谢你的帮助。