Доступ к атрибутам модели, содержащимся в объекте ModelAndView, из контекста теста контроллера



Я новичок в Spring MVC и сейчас учусь тестировать свои контроллеры. У меня есть простой тест:



@Test
public void shouldDoStuff()
{
request.setRequestURI("/myCompany/123");
ModelAndView mav = controller.getSomeDatas("123", request);
assertEquals(mav.getViewName(), "company");
assertTrue(mav.getModel().containsKey("companyInfo"));
assertTrue(mav.getModel().containsKey("rightNow"));
assertEquals(mav.getModel().get("companyInfo"), "123");
}


Вот мое действие контроллера:



@RequestMapping(value = "/myCompany/{companyGuid}", method = RequestMethod.GET)
public ModelAndView getSomeDatas(@PathVariable("companyGuid") String myGuid, HttpServletRequest request)
{
/*ModelAndView mav = new ModelAndView("company");
mav.addObject("companyInfo", myGuid);
mav.addObject("rightNow", (new Date()).toString());
return mav;*/
Map<String, Object> myModel = new HashMap<String, Object>();

myModel.put("companyInfo", myGuid);
myModel.put("rightNow", (new Date()).toString());

return new ModelAndView("company", "model", myModel);
}


У меня есть точка останова, установленная на первом assert. В окне дисплея в Eclipse, mav.getModel() возвращает именно то, что я ожидал:



mav.getModel()
(org.springframework.ui.ModelMap) {model={rightNow=Fri Nov 05 13:30:57 CDT 2010, companyInfo=123}}


Однако любая попытка получить доступ к значениям в этой модели терпит неудачу. Например, я предположил, что будет работать следующее:

mav.getModel().get("companyInfo")
null
mav.getModel().containsKey("companyInfo")
(boolean) false


Но, как вы можете видеть, get ("companyInfo") возвращает null, а containsKey("companyInfo") возвращает false.



Когда я заменяю закомментированный раздел контроллера на раскомментированный, мои тесты работают просто отлично, но затем мое представление jsp ломается, потому что я пытаюсь получить доступ к свойствам модели, говоря такие вещи, как ${model.companyInfo} и др.



Поэтому мне нужно знать хотя бы одну из двух вещей (но лучше, если вы сможете ответить на обе):


  1. Если я оставлю контроллер, как показано, как я могу получить доступ к атрибутам модель в моем тесте?

  2. если я заменяю раздел с комментариями на раздел без комментариев, как я могу получить доступ к атрибутам модели в моем представлении jsp?


Любая помощь ценится.

640   4  

4 ответов:

Для вопроса 1 модель предоставляет метод, который возвращает атрибуты модели в виде карты. В своем тесте вы можете сделать:

Map<String,Object> modelMap = mav.getModel().asMap();
modelMap.get("companyInfo");

Предполагая, что вы установили companyInfo в модель, она должна быть там.

Что касается части 2 вопроса, я думаю, что кто-то уже ответил на этот вопрос.

Хорошо, теперь все ясно!

Попробуйте:

mav.getModel().get("model");
mav.getModel().containsKey("model");

Вы назвать модель вашей modelmap в ваш контроллер...

В вашем jsp я бы рекомендовал использовать Jstl:

<%@page contentType="text/html; charset=utf-8" pageEncoding="UTF-8" language="java"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
     ${model.companyInfo}
    </body>
</html>

Вы забыли вызвать конструктор ModelAndView с именем вида, и вы забыли добавить свои объекты в модель.

Я думаю, что ваш код должен выглядеть примерно так...
@Test
public void shouldDoStuff()
{
    request.setRequestURI("/myCompany/123");
    // call the constructor with the name of your view        
    ModelAndView mav = new ModelAndView("viewName"); 
    // add the objects to the model        
    mav.addAllObjects(controller.getSomeDatas("123", request));
    assertEquals(mav.getViewName(), "viewName");
    assertTrue(mav.getModel().containsKey("companyInfo"));
}

Если вам нужно добавить несколько объектов с пользовательскими ключами, используйте метод addObject;

  mav.addObject("key1", 1);
  mav.addObject("key2", 2);

@pedrofalcaocosta, я даю ваш ответ голосом вверх, потому что это помогло мне найти свой ответ, но я думаю, что здесь уместно ответить на мой собственный вопрос:

((java.util.HashMap<String,Object>)mav.getModel().get("model")).get("companyInfo")

Comments

    Ничего не найдено.