【问题标题】:Testing Spring MVC Request Parameter Map and MultipartFile with MockMVC使用 MockMVC 测试 Spring MVC 请求参数映射和 MultipartFile
【发布时间】:2014-02-06 03:27:24
【问题描述】:

我正在尝试使用 Spring MVC 3.2 创建一个 RESTful 控制器端点来上传文件以及该文件的元数据映射。定义如下:

@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 使用 String 并执行以下操作:

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

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

但这感觉很脏。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 那么问题是您无法获取 MultipartFile 还是元数据中有不应该存在的值?

标签: spring-mvc


【解决方案1】:

使用 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");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2020-11-24
    • 2011-12-08
    • 2011-02-14
    • 2013-07-06
    相关资源
    最近更新 更多