스프링 MVC 테스트를 사용한 멀티파트 POST 요청 유닛화
자동 저장을 위한 다음과 같은 요청 핸들러가 있습니다.예를 들어 cURL을 사용했을 때 이것이 동작하는 것을 확인했습니다.이제 Spring MVC Test와 함께 Method를 unit test 하고 싶습니다.fileUploader를 사용하려고 했지만 제대로 작동하지 않습니다.JSON 부분도 추가할 수 없습니다.
스프링 MVC 테스트에서 이 방법을 테스트하려면 어떻게 해야 합니까?나는 이것에 대해 어떤 예도 찾을 수 없다.
@RequestMapping(value = "autos", method = RequestMethod.POST)
public ResponseEntity saveAuto(
@RequestPart(value = "data") autoResource,
@RequestParam(value = "files[]", required = false) List<MultipartFile> files) {
// ...
}
auto + 1개 이상의 파일의 JSON 표현을 업 로드하고 싶다.
정답에 현상금 100을 더 드리겠습니다!
부터MockMvcRequestBuilders#fileUpload
는 권장되지 않습니다.를 반환하는 를 사용할 수 있습니다.그럼 전화도 많이 끊고
여기 작업 예가 있습니다.소정의 경우@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을 송신하고 있다는 것입니다.
방법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());
}
}
이 예는 봄 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"));
}
}
테스트 대상 Email Controller에 파일을 첨부합니다.우체부 스크린샷도 봐주세요. 제가 어떻게 데이터를 올리고 있는지요.
@WebAppConfiguration
@RunWith(SpringRunner.class)
@SpringBootTest(
classes = EmailControllerBootApplication.class
)
public class SendEmailTest {
@Autowired
private WebApplicationContext webApplicationContext;
@Test
public void testSend() throws Exception{
String jsonStr = "{\"to\": [\"email.address@domain.com\"],\"subject\": "
+ "\"CDM - Spring Boot email service with attachment\","
+ "\"body\": \"Email body will contain test results, with screenshot\"}";
Resource fileResource = new ClassPathResource(
"screen-shots/HomePage-attachment.png");
assertNotNull(fileResource);
MockMultipartFile firstFile = new MockMultipartFile(
"attachments",fileResource.getFilename(),
MediaType.MULTIPART_FORM_DATA_VALUE,
fileResource.getInputStream());
assertNotNull(firstFile);
MockMvc mockMvc = MockMvcBuilders.
webAppContextSetup(webApplicationContext).build();
mockMvc.perform(MockMvcRequestBuilders
.multipart("/api/v1/email/send")
.file(firstFile)
.param("data", jsonStr))
.andExpect(status().is(200));
}
}
Spring4/SpringBoot 1.x 를 사용하고 있는 경우는, 「텍스트」(json) 부품도 추가할 수 있습니다.이것은 MockMvcRequestBuilders를 통해 실행할 수 있습니다.fileUpload().file(MockMultipartFile 파일)(메서드로 필요).multipart()
이 버전에서는 사용할 수 없습니다).
@Test
public void test() throws Exception {
mockMvc.perform(
MockMvcRequestBuilders.fileUpload("/files")
// file-part
.file(makeMultipartFile( "file-part" "some/path/to/file.bin", "application/octet-stream"))
// text part
.file(makeMultipartTextPart("json-part", "{ \"foo\" : \"bar\" }", "application/json"))
.andExpect(status().isOk())));
}
private MockMultipartFile(String requestPartName, String filename,
String contentType, String pathOnClassPath) {
return new MockMultipartFile(requestPartName, filename,
contentType, readResourceFile(pathOnClasspath);
}
// make text-part using MockMultipartFile
private MockMultipartFile makeMultipartTextPart(String requestPartName,
String value, String contentType) throws Exception {
return new MockMultipartFile(requestPartName, "", contentType,
value.getBytes(Charset.forName("UTF-8")));
}
private byte[] readResourceFile(String pathOnClassPath) throws Exception {
return Files.readAllBytes(Paths.get(Thread.currentThread().getContextClassLoader()
.getResource(pathOnClassPath).toUri()));
}
}
언급URL : https://stackoverflow.com/questions/21800726/using-spring-mvc-test-to-unit-test-multipart-post-request
'it-source' 카테고리의 다른 글
는 Tinymce로 감겨져 .는 Tinymce로 감겨져 .는 Tinymce로 감겨져 .태그. CSS가 돌아다니거나 텍스트 에디터를 해킹하거나 (0) | 2023.02.12 |
---|---|
AJAX 어플리케이션의 뒤로 버튼 호출 대행 수신 (0) | 2023.02.12 |
Karma+Angular 내에서 모의 JSON 파일 로드JS 테스트 (0) | 2023.02.08 |
이미 선언된 JSON 개체에 키 값 쌍을 추가하는 방법 (0) | 2023.02.08 |
UTF-8 인코딩을 사용하여 RestTemplate에 POST를 지시하려면 어떻게 해야 합니까? (0) | 2023.02.08 |