Использование теста Spring MVC для модульного тестирования многопартийного запроса POST
У меня есть следующий обработчик запросов для сохранения авто. Я проверил, что это работает, когда я использую, например, cURL. Теперь я хочу провести модульное тестирование метода с помощью Spring MVC Test. Я пытался использовать fileUploader, но мне не удается заставить его работать. Также мне не удается добавить часть JSON.
Как бы я проверил этот метод с помощью теста Spring MVC? Я не могу найти никаких примеров по этому поводу.
@RequestMapping(value = "autos", method = RequestMethod.POST)
public ResponseEntity saveAuto(@RequestPart(value = "data") AutoResource,
@RequestParam(value = "files[]", required = false) List<MultipartFile> files) {...}
Я хочу поднять представление JSON для моего auto + one или еще файлы.
Я добавлю 100 в награду за правильный ответ!
3 ответов:
С
MockMvcRequestBuilders#fileUploadустарел, вы хотите использоватьMockMvcRequestBuilders#multipart(String, Object...)который возвращает aMockMultipartHttpServletRequestBuilder. Тогда цепочка кучаfile(MockMultipartFile)звонки.вот рабочий пример. Учитывая
@Controller@Controller public class NewController { @RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public String saveAuto( @RequestPart(value = "json") JsonPojo pojo, @RequestParam(value = "some-random") String random, @RequestParam(value = "data", required = false) List<MultipartFile> files) { System.out.println(random); System.out.println(pojo.getJson()); for (MultipartFile file : files) { System.out.println(file.getOriginalFilename()); } return "success"; } static class JsonPojo { private String json; public String getJson() { return json; } public void setJson(String json) { this.json = json; } } }и модульный тест
@WebAppConfiguration @ContextConfiguration(classes = WebConfig.class) @RunWith(SpringJUnit4ClassRunner.class) public class Example { @Autowired private WebApplicationContext webApplicationContext; @Test public void test() throws Exception { MockMultipartFile firstFile = new MockMultipartFile("data", "filename.txt", "text/plain", "some xml".getBytes()); MockMultipartFile secondFile = new MockMultipartFile("data", "other-file-name.data", "text/plain", "some other type".getBytes()); MockMultipartFile jsonFile = new MockMultipartFile("json", "", "application/json", "{\"json\": \"someValue\"}".getBytes()); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); mockMvc.perform(MockMvcRequestBuilders.multipart("/upload") .file(firstFile) .file(secondFile) .file(jsonFile) .param("some-random", "4")) .andExpect(status().is(200)) .andExpect(content().string("success")); } }и
@Configurationкласс@Configuration @ComponentScan({ "test.controllers" }) @EnableWebMvc public class WebConfig extends WebMvcConfigurationSupport { @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); return multipartResolver; } }тест должен пройти и дать вам выход
4 // from param someValue // from json file filename.txt // from first file other-file-name.data // from second fileследует отметить, что вы отправляете JSON так же, как и любой другой составной файл, за исключением другого типа контента.
посмотрите на этот пример, взятый из витрины spring MVC, это ссылка на исходный код:
@RunWith(SpringJUnit4ClassRunner.class) public class FileUploadControllerTests extends AbstractContextControllerTests { @Test public void readString() throws Exception { MockMultipartFile file = new MockMultipartFile("file", "orig", null, "bar".getBytes()); webAppContextSetup(this.wac).build() .perform(fileUpload("/fileupload").file(file)) .andExpect(model().attribute("message", "File 'orig' uploaded successfully")); } }
метод
MockMvcRequestBuilders.fileUploadНе рекомендуется использоватьMockMvcRequestBuilders.multipartвместо.вот пример:
import static org.hamcrest.CoreMatchers.containsString; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.multipart.MultipartFile; /** * Unit test New Controller. * */ @RunWith(SpringRunner.class) @WebMvcTest(NewController.class) public class NewControllerTest { private MockMvc mockMvc; @Autowired WebApplicationContext wContext; @MockBean private NewController newController; @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(wContext) .alwaysDo(MockMvcResultHandlers.print()) .build(); } @Test public void test() throws Exception { // Mock Request MockMultipartFile jsonFile = new MockMultipartFile("test.json", "", "application/json", "{\"key1\": \"value1\"}".getBytes()); // Mock Response NewControllerResponseDto response = new NewControllerDto(); Mockito.when(newController.postV1(Mockito.any(Integer.class), Mockito.any(MultipartFile.class))).thenReturn(response); mockMvc.perform(MockMvcRequestBuilders.multipart("/fileUpload") .file("file", jsonFile.getBytes()) .characterEncoding("UTF-8")) .andExpect(status().isOk()); } }
Comments