2013-03-25 2 views
1

У меня есть следующий контроллерSpring 3.2.2: MockMVC, возвращаемые порожние результаты

@Controller 
@RequestMapping("/rest/transceptors") 
public class TransceptorRestController 
{ 
    @Autowired 
    private TransceptorDao transceptorDao; 

    @RequestMapping(value="/get/{idTransceptor}", method=RequestMethod.GET) 
    public @ResponseBody Transceptor getOne(@PathVariable("idTransceptor") Long idTransceptor) 
    { 
     return transceptorDao.searchByIdTransceptor(idTransceptor); 
    } 
} 

Rest Этот контроллер работает правильно при работе в JBoss, и результаты, как и ожидалось. Я использую Postman (расширение тестирования REST для Google Chrome), и я могу получить правильные результаты в XML и JSON.

Но у меня проблема при использовании MockMVC для тестирования этого.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(
locations={ 
    "classpath:test-servlet-context.xml" 
}) 
@WebAppConfiguration 
public class TransceptorRestControllerTest { 

@Autowired 
private WebApplicationContext wac; 

private MockMvc mockMvc; 

@Before 
public void setup() 
{ 
    mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); 
} 

@Test 
public void testRoot() throws Exception 
{ 
    mockMvc.perform(get("/")). 
    andExpect(status().isOk()); 
} 

@Test 
public void testGet() throws Exception 
{ 
    mockMvc.perform(get("/rest/transceptors/get/1")) 
    .andExpect(status().isOk()) 
    .andDo(print()) 
    .andExpect(model().attribute("name", equals("Test_Name_1"))); 
} 

Тест TestRoot работает нормально. Но, когда я пытаюсь использовать andExpect (model() ... я получаю сообщение «No ModelAndView Found»

При замене части модели() на конкретные ожидания для XML или JSON строки XML и JSON всегда возвращаются пусто.

я потратил дней, пытаясь понять это, и я довольно новыми для Java и новые для Spring. можете ли вы сказать мне, где я могу смотреть это исправить?

Как информация Дополнительно дворец, я (с sfj4l) повсюду, но при работе с Junit, сообщения журнала в DAO работают, сообщения журнала в самом тестовом модуле работают, но сообщения журнала внутри моего контроллера REST не отображаются.

Похоже, что функция GET сопоставлена, но содержимое функции никогда не выполняется и получает пустые ответы. Несмотря на это, мои призывы к isOk() успешны.

ответ

0

"No ModelAndView Found" является правильным. С @ResponseBody возвращаемое значение записывается непосредственно в тело ответа. Нет модели, нет разрешения на просмотр и т. Д.

В целом, в идеале сосредоточиться на тестировании результата запроса с точки зрения клиента. Это включает заголовки ответа, тело и статус ответа. Проверьте другие результаты, которые обычно не видны клиенту, такие как атрибуты модели более экономно.

+0

Если ModelAndView пуст, я понимаю это. Но не должно ли это возвращать XML или JSON-контент в теле? Я говорю это, потому что при использовании _xpath_ или _json_ функций с _andExpect() _ результаты также пусты. Я получаю сообщения типа «malformed xml в строке 1 столбец 1» для XML или «no json data» для JSON. Кроме того, при использовании _andDo (print()) тело возвращается также при проверке вывода консоли. – devnull

+0

Кроме того, я должен добавить, что использование только _andExpect (content(). String (_ ... это тоже возвращает пустые результаты. Это не вопрос ModelAndView. – devnull

+0

@devnull, такой же выпуск здесь. Вы когда-нибудь это выясняли? – Nikita

0

У меня была почти идентичная проблема, как у вас, и, похоже, найти причину проблемы.

Я объяснил свою ситуацию в одном из комментариев ниже, но это должно быть более полным.

Я использую Spring Roo 1.2.4, Spring 3.2.3. Когда я запускаю свое приложение, я могу скручивать все контроллеры, и все они работают нормально. Но один из моих контроллеров возвращает пустой json в тестах mockmvc, никаких ошибок не было.

Я нашел проблему с TRY выделяющихся проблемами Им генерируется AspectJ код контроллера (те файлы, которые говорят, вы не должны изменять их) и обнаружил, что сериализации код (.toJsonArray) терпит неудачу с

org.hibernate.LazyInitializationException: failed to lazily initialize a collection...

который молча игнорируется, и трассировка стека не выводится автоматически.