Как протестировать с помощью MockMVC параметр Map в Spring Rest

В Spring Rest у меня есть RestController, предоставляющий этот метод:

@RestController
@RequestMapping("/controllerPath")
public class MyController{
    @RequestMapping(method = RequestMethod.POST)
    public void create(@RequestParameter("myParam") Map<String, String> myMap) {
         //do something
    }
}

Я хотел бы протестировать этот метод, используя MockMVC из Spring:

// Initialize the map
Map<String, String> myMap = init();

// JSONify the map
ObjectMapper mapper = new ObjectMapper();
String jsonMap = mapper.writeValueAsString(myMap);

// Perform the REST call
mockMvc.perform(post("/controllerPath")
            .param("myParam", jsonMap)
            .andExpect(status().isOk());

Проблема в том, что я получаю код ошибки HTTP 500. Я почти уверен, что это связано с тем, что я использую Map в качестве параметра моего контроллера (я попытался изменить его на String, и это работает).

Возникает вопрос: как я могу иметь параметр Map в моем RestController и правильно протестировать его с помощью MockMVC?

Спасибо за любую помощь.


person Rémi Doolaeghe    schedule 01.10.2015    source источник
comment
Если вы получаете внутреннюю ошибку сервера, у вас также должна быть где-то трассировка стека. Как выглядит настройка вашего тестового класса? Возможно, что-то не так.   -  person hotzst    schedule 01.10.2015
comment
Ты прав. После тщательного изучения моего журнала я обнаружил следующее: Не удалось преобразовать значение типа «java.lang.String» в требуемый тип «java.util.Map»; вложенным исключением является java.lang.IllegalStateException: невозможно преобразовать значение типа [java.lang.String] в требуемый тип [java.util.Map]: не найдены подходящие редакторы или стратегия преобразования. Другими словами, как я могу указать карту MockMVC в качестве параметра, чтобы она соответствовала карте в методе моего контроллера?   -  person Rémi Doolaeghe    schedule 01.10.2015
comment
Взгляните на stackoverflow.com/questions/21175066/   -  person hotzst    schedule 01.10.2015
comment
Я использовал Gson вместо ObjectMapper, как указано в вашей ссылке, но безуспешно (тот же результат)... Есть другие идеи?   -  person Rémi Doolaeghe    schedule 01.10.2015
comment
Хорошо, я нашел причину, я думаю. НИКОГДА не используйте напрямую карту в качестве параметра, всегда оборачивайте ее в класс Wrapper.   -  person Rémi Doolaeghe    schedule 02.10.2015


Ответы (1)


Я знаю, что это старый пост, но я столкнулся с той же проблемой и решил ее следующим образом:

Мой контроллер был (Проверьте, что RequestParam не имеет имени):

@GetMapping
public ResponseEntity findUsers (@RequestParam final Map<String, String> parameters) {
//controller code
}

В моем модульном тесте я сделал:

MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
parameters.put("name", Collections.singletonList("test"));
parameters.put("enabled", Collections.singletonList("true"));

final MvcResult result = mvc.perform(get("/users/")
                .params(parameters)
                .contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(status().isOk())
                .andReturn();      
person Daniela    schedule 09.08.2019