有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

RESTful webservice与spring mvc的java图像上传集成测试

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

org.springframework.web.utill.NestedServletException:Request Processing Failed;nested exception is java.lang.illigulArgument

或http状态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 = []

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


共 (1) 个答案

  1. # 1 楼答案

    问题是因为控制器类旨在接收多部分/表单数据,但发送了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);
        }
    }