2015-09-23 4 views
1

Я пытался в течение нескольких часов кодировать JSON в качестве параметра запроса для теста, который я пишу, используя MockMVC Spring, но не повезло.Как кодировать JSON в качестве параметра запроса с помощью Spring MockMVC

Мой тест выглядит

@Before 
public void setUp() {  
    mockMvc = MockMvcBuilders.standaloneSetup(new TestController()) 
      .build(); 
} 

@Test 
public void shouldReturnJSONGeneratedByView() throws Exception { 
    String sampleJson = "{\"key\":\"value\"}"; 

    String json = UriComponentsBuilder.newInstance() 
    .path(sampleJson) 
    .build().encode().toUriString(); 

    mockMvc.perform(MockMvcRequestBuilders.get("/Node?json="+json)) 
    .andExpect(status().isOk()); 
} 

но строка, которая достигает мой контроллер по-прежнему кодируется ("% 7B% 22key% 22:% 22value% 22% 7D") и поэтому не может быть десериализации, как JSON.

Что мне не хватает, чтобы получить весну, чтобы понять закодированные параметры?

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

+0

Почему вы просто декодировать его, а затем использовать его как JSON. – erhun

+0

Это часть существующего приложения, которое отлично работает при проверке вручную (контроллер получает декодированный JSON), но я пытаюсь добавить некоторые автоматизированные тесты. Поскольку функциональность работает, я не хочу менять контроллер на случай, если я сломаю что-то –

+0

Хорошо, я понимаю, что я не думаю, что вы нарушите что-то, проблема должна быть в вашем конвертере JSON не работает, когда вы вызываете его из MockMvcRequestBuilders.get, потому что это не запрос прийти к Spring DispatcherServlet и некоторые аннотации (которые могут обеспечить конверсии), возможно, будет полезно разделить код контроллера и проверить ваши настройки Spring. Честно говоря, Контроллер не должен быть таким же, как и вы, вам следует написать тесты для вашего уровня сервиса. – erhun

ответ

2

Я считаю, что ваш JSON был закодирован в два раза, и, следовательно, контроллер принимает строку, которая до сих пор закодированную (после того, как декодируется только один раз).

В JavaDoc for MockMvcRequestBuilders говорится следующее о первом параметре get:

urlTemplate - шаблон URL; полученный URL будет закодирован

Поэтому я думаю, что вам не нужно кодировать JSON самостоятельно, а следующее должно работать:

mockMvc.perform(MockMvcRequestBuilders.get("/Node?json={json}", sampleJson)) 
.andExpect(status().isOk()); 
+0

Спасибо! Это почти правильно, но я на правильном пути. Исправлено было использование urlTemplate mockMvc.perform (MockMvcRequestBuilders.get ("/ Node? Json = {json}", sampleJson)), в противном случае весна пытается расширить json, как если бы это был шаблон uri. Если вы обновите свой ответ, я буду рад принять его. –

+0

является '{json}' значительным, или вы могли бы поместить '? Json = {foo}'? – Snekse