2014-01-16 2 views
4

스프링 MVC 3.2를 사용하여 RESTful 컨트롤러 끝점을 만들어 파일 및 해당 파일의 메타 데이터 맵을 업로드하려고합니다. 나는 다음과 같은 테스트하기 위해 노력하고있어MockMVC를 사용하여 스프링 MVC 요청 매개 변수 맵 및 MultipartFile을 테스트하십시오.

@Controller 
@RequestMapping("/file") 
public class FileServiceController { 
    @RequestMapping(value="/upload", method=RequestMethod.POST) 
    @ResponseBody 
    public void upload(@RequestParam MultipartFile file, 
         @RequestParam String fileType, 
         @RequestParam(value="metadata") Map<String, List<String>> metadata) { 
     // TODO: stuff with things 
    } 
} 

:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { AppConfig.class }) 
@WebAppConfiguration 
public class ProductIngestServiceControllerTest { 

    @Autowired 
    private WebApplicationContext wac; 
    private MockMvc mockMvc; 
    @Mock 
    private FileServiceController controller; 

    @Before 
    public void setup() { 
     mockMvc = MockMvcBuilders.standaloneSetup(controller).build(); 
    } 

    @Test 
    public void testUpload() { 
     MockMultipartFile mockFile = new MockMultipartFile("file", "This is a test file".getBytes()); 
     Map<String, List<String>> metadata = new HashMap<>(); 
     metadata.put("custom0", Arrays.asList("test1", "test2")); 
     metadata.put("custom1", Arrays.asList("test3", "test4", "test5")); 
     metadata.put("custom2", Arrays.asList("test6")); 

     Gson gson = new Gson(); 
     String mapStr = gson.toJson(metadata); 

     mockMvc.perform(fileUpload(baseURL + "/test") 
      .file(mockFile) 
      .param("fileType", "test_type") 
      .param("metadata", mapStr)) 
      .andDo(print()) 
      .andExpect(status().isOk()) 
      .andReturn(); 
    } 
} 

가 난 그냥 "customX"항목을 포함하는지도를 기대 해요,하지만 모든 요청 매개 변수가 포함되어 다음과 같이 정의 대신 (MultipartFile을 제외하고 ...).

내가하려고하면 :

public void upload(@RequestParam MultiValueMap parameters) { 
    ... 
} 

의 MultipartFile는 그 중 하나지도에 포함되지 않습니다.

내가 잘못 생각하고 있습니까? 나는 순간에 가지고 올 수있는 유일한 솔루션은 메타 데이터 RequestParam에 대한 문자열을 사용하고 같은 것을 할 수 있습니다 :

ObjectMapper mapper = new ObjectMapper(); 
JsonFactory factory = mapper.getJsonFactory(); 

JsonParser jp = factory.createJsonParser(testMap); 
Map<String, List<String>> map = jp.readValueAs(Map.class); 

를하지만 더러운 느낌.

도움을 주시면 감사하겠습니다. 감사!

+0

MultipartFile을 가져올 수 없거나 거기에 없어야하는 메타 데이터의 값이 있다는 문제가 있습니까? – phantastes

답변

0

MockHttpServletRequest를 사용하십시오.

@Before 
public void before() { 
    MockitoAnnotations.initMocks(this); 
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac) 
      .dispatchOptions(true).build(); 
    MockHttpServletRequest request;= new MockHttpServletRequest(); 
    Map<String, List<String>> metadata=request.getParameter("metadata"); 
} 
관련 문제