Как выполнить модульное тестирование метода контроллера, который имеет RequestParam объекта?

У меня есть сопоставление контроллера

@RequestMapping(value = "/something", method = RequestMethod.GET)
public String get(@RequestParam("id") Person aPerson, Model aModel) {

    aModel.addAttribute("person", aPerson);
    return "index";
}

Как мне протестировать это через MockMvc?

Я могу сделать что-то вроде этого

mockMvc.perform(get("/something?id=1")).andExpect(status().is2xxSuccessful());

Но это не сработает, так как RequestParam — это объект, а не строка. Преобразование выполняется Spring, но я выполняю модульное тестирование метода и не хочу запускать контекст приложения. Как мне выполнить модульное тестирование с помощью MockMvc?


person John Doe    schedule 22.03.2019    source источник
comment
Если бы вам пришлось документировать свой HTTP API, чтобы его мог использовать клиент, как бы вы поступили? Что бы вы сказали о том, какие параметры можно передавать? Если вы не знаете, то это проблема, потому что вы не знаете, как можно использовать созданный вами API. Если вы знаете, то у вас есть ответ: отправьте параметры, которые ожидает ваш API: ваш тест является клиентом вашего API. Тот факт, что вы используете POJO для их сбора, является деталью реализации.   -  person JB Nizet    schedule 22.03.2019
comment
Я пишу отсутствующие модульные тесты для некоторого устаревшего кода, поэтому я не писал контроллер. Я могу легко выполнить модульное тестирование без использования MockMvc, просто вызвав метод и утверждая, что ответ String является путем к правильному представлению, а также проверив, что модель содержит атрибут person. Однако мой вопрос заключается в том, как это сделать с помощью MockMvc, потому что я взял за привычку писать все остальные модульные тесты, используя вышеупомянутый шаблон.   -  person John Doe    schedule 22.03.2019
comment
API ожидает один параметр с именем id. Посмотрите на код Person, чтобы узнать, каким должен быть тип этого идентификатора.   -  person JB Nizet    schedule 22.03.2019
comment
@JohnDoe ты проверил мой ответ? должно сработать.   -  person Gewure    schedule 27.03.2019


Ответы (1)


вы можете попробовать что-то вроде

    @Test
    public void test() throws Exception {
       Model model= new Model();
       mockMvc.perform(MockMvcRequestBuilders.get("/something?id=1")
         .content(asJsonString(model))
         .contentType(MediaType.APPLICATION_JSON)
         .accept(MediaType.APPLICATION_JSON)).andExpect(status().is2xxSuccessful());
    }
person Gewure    schedule 23.03.2019