从控制器测试的上下文中访问ModelAndView对象中包含的模型的属性

时间:2010-11-05 18:50:21

标签: java spring-mvc junit

我是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);
}

我在第一个断言上设置断点。在Eclipse的Display窗口中,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视图中访问模型的属性?
  3. 感谢任何帮助。

4 个答案:

答案 0 :(得分:10)

对于问题1,Model提供了一种将模型属性作为地图返回的方法。在您的测试中,您可以:

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

假设您将companyInfo设置为模型,它应该在那里。

关于问题的第2部分,我认为其他人已经回答了这个问题。

答案 1 :(得分:6)

好的,现在很清楚了!

尝试:

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

您在控制器中调用了模型图“模型”...

在你的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>

答案 2 :(得分:1)

您忘记使用viewname调用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);

答案 3 :(得分:1)

@pedrofalcaocosta,我正在给你的回答,因为它帮助我找到答案,但我认为在这里回答我自己的问题是合适的:

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