2016-07-25 48 views
5

Mam metody kontrolera z PUT metodę, która odbiera multipart/form-data:Jak wprowadzić dane wieloczęściowe/formularze za pomocą Spring MockMvc?

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

i chcę go przetestować za pomocą MockMvc. Niestety MockMvcRequestBuilders.fileUpload tworzy zasadniczo wystąpienie MockMultipartHttpServletRequestBuilder który ma POST metody:

super(HttpMethod.POST, urlTemplate, urlVariables) 

EDIT: pewnością mogę nie mogę stworzyć własną implementację MockHttpServletRequestBuilder, powiedzmy

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

ponieważ MockHttpServletRequestBuilder ma konstruktor-lokalny pakiet.

Ale zastanawiam się, czy nie jest to bardziej wygodne. Czy można to zrobić, czy można pominąć jakąś istniejącą klasę lub metodę, aby to zrobić?

+0

Czy możesz zaznaczyć moją odpowiedź jako zaakceptowaną odpowiedź? Pomoże to utrzymać czysty i wydajny przepływ StackOverflow. Dzięki! – HammerNL

+1

Jest to zrobione =======> – Andremoniy

Odpowiedz

18

Tak, jest sposób, i to jest proste!

Sam wpadłem na ten sam problem. Chociaż zniechęciła mnie odpowiedź Sama Brannena, wygląda na to, że Spring MVC w dzisiejszych czasach obsługuje przesyłanie plików PUT, ponieważ mogłem po prostu wykonać taką prośbę za pomocą Postmana (używam Spring Boot 1.4.2). Tak więc kontynuowałem kopanie i odkryłem, że jedynym problemem jest fakt, że MockMultipartHttpServletRequestBuilder zwrócony przez MockMvcRequestBuilders.fileUpload() ma metodę na stałe "POST". Wtedy odkryłem metodę with() ...

i że pozwolił mi wymyślić to schludny mały trik, aby wymusić MockMultipartHttpServletRequestBuilder użyć metody „put” i tak:

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()); 

działa jak marzenie!

+0

Przyjemna praca! –

+1

To powinno być rozwiązaniem tego problemu, ponieważ pozwala rozwiązać problem osoby, która zadaje pytanie: – ftrujillo

+0

To zdecydowanie powinno być oznaczone jako odpowiedź. – mogronalol

4

Niestety nie jest to obecnie obsługiwane w Spring MVC Test i nie widzę obejścia innego niż tworzenie własnego niestandardowego kodu MockPutMultipartHttpServletRequestBuilder i kopiowania i wklejania ze standardowej implementacji.

Spring MVC również domyślnie nie obsługuje domyślnie żądań przesłania plików przez PUT. Twórcy tłumaczeń wieloczęściowych są zakodowani, aby akceptować tylko żądania przesłania plików - zarówno dla Apache Commons, jak i standardowej obsługi API Servlet.

Jeśli chcesz, aby aplikacja Spring obsługiwała również żądania PUT, to prosimy o kontakt z open a ticket w narzędziu do śledzenia wydań JIRA.

+0

Znalazłem proste rozwiązanie! Sprawdź moją odpowiedź – HammerNL