2016-07-25 9 views
5

меня есть метод контроллера с PUT методом, который принимает многослойную/форм-данных:Как PUT multipart/form-data использовать Spring MockMvc?

@RequestMapping(value = "/putIn", method = RequestMethod.PUT) 
    public Foo updateFoo(HttpServletRequest request, 
          @RequestBody Foo foo, 
          @RequestParam("foo_icon") MultipartFile file) { 
    ... 
    } 

и я хочу, чтобы проверить его с помощью MockMvc. К сожалению MockMvcRequestBuilders.fileUpload создает по существу экземпляр MockMultipartHttpServletRequestBuilder, который имеет POST метод:

super(HttpMethod.POST, urlTemplate, urlVariables) 

EDIT: Конечно, я могу я не могу создать свою собственную реализацию MockHttpServletRequestBuilder, скажем

public MockPutMultipartHttpServletRequestBuilder(String urlTemplate, Object... urlVariables) { 
    super(HttpMethod.PUT, urlTemplate, urlVariables); 
    super.contentType(MediaType.MULTIPART_FORM_DATA); 
} 

потому что MockHttpServletRequestBuilder имеет локальный конструктор пакетов.

Но мне интересно, удобнее ли? Есть ли способ сделать это, может быть, я пропустил какой-нибудь существующий класс или метод для этого?

+0

Не могли бы вы отметить мой ответ как принятый ответ? Это поможет сохранить безопасность и эффективность StackOverflow. Благодаря! – HammerNL

+1

Выполнено =======>> – Andremoniy

ответ

18

Да, есть способ, и это тоже просто!

Я столкнулся с той же проблемой сам. Хотя я был обескуражен ответом Сэма Браннен, похоже, что Spring MVC в настоящее время поддерживает загрузку файлов PUT, поскольку я могу просто сделать такой запрос с помощью Postman (я использую Spring Boot 1.4.2). Итак, я продолжал копать и обнаружил, что единственная проблема заключается в том, что MockMultipartHttpServletRequestBuilder, возвращенный MockMvcRequestBuilders.fileUpload(), имеет метод, жестко запрограммированный на «POST». Тогда я открыл with() метод ...

и что позволило мне придумать с этой аккуратной маленькой хитростью, чтобы заставить MockMultipartHttpServletRequestBuilder использовать метод «PUT» в любом случае:

MockMultipartFile file = new MockMultipartFile("data", "dummy.csv", 
      "text/plain", "Some dataset...".getBytes()); 

    MockMultipartHttpServletRequestBuilder builder = 
      MockMvcRequestBuilders.fileUpload("/test1/datasets/set1"); 
    builder.with(new RequestPostProcessor() { 
     @Override 
     public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request) { 
      request.setMethod("PUT"); 
      return request; 
     } 
    }); 
    mvc.perform(builder 
      .file(file)) 
      .andExpect(status().ok()); 

работает как шарм!

+0

Хорошая обстановка! –

+1

Это должно быть решение вопроса, потому что это позволяет решить проблему человека, задающего вопрос – ftrujillo

+0

Это обязательно должно быть отмечено как ответ. – mogronalol

4

К сожалению, в данный момент это не поддерживается в Spring MVC Test, и я не вижу рабочего порядка, кроме создания собственного кода MockPutMultipartHttpServletRequestBuilder и копирования-n-вставки из стандартной реализации.

Для чего стоит, Spring MVC также не поддерживает PUT запросы на загрузку файлов по умолчанию. Преобразователи Multipart жестко закодированы, чтобы принимать только POST запросы на загрузку файлов - как для Apache Commons, так и для стандартной поддержки API сервлета.

Если вы хотите, чтобы Spring поддерживала PUT запросов, не стесняйтесь, напишите open a ticket в журнале Spring JARA.

+0

Я нашел простое решение! Проверьте мой ответ – HammerNL