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

Sam*_*amo 3 java junit spring-mvc

我是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");
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器动作:

@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);
}
Run Code Online (Sandbox Code Playgroud)

我在第一个断言上设置了断点.在Eclipse的Display窗口中,mav.getModel()完全返回我期望的内容:

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

但是,任何访问该模型中的值的尝试都会失败.例如,我假设以下内容可行:

mav.getModel().get("companyInfo")
 null
mav.getModel().containsKey("companyInfo")
 (boolean) false
Run Code Online (Sandbox Code Playgroud)

但正如您所看到的,get("companyInfo")返回null,而containsKey("companyInfo")返回false.

当我用未注释的部分替换控制器的注释部分时,我的测试工作得很好,但后来我的jsp视图中断,因为我试图通过说$ {model.companyInfo}之类的东西来访问模型的属性,等等

所以我需要知道两件事中的至少一件(但如果你能回答两件事,那就更好了):

  1. 如果我如图所示离开控制器,如何在测试中访问模型的属性?
  2. 如果我替换未注释部分的注释部分,如何在jsp视图中访问模型的属性?

任何帮助表示赞赏.

san*_*alp 11

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

Map<String,Object> modelMap = mav.getModel().asMap();
modelMap.get("companyInfo");
Run Code Online (Sandbox Code Playgroud)

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

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


ped*_*sta 6

好的,现在很清楚了!

尝试:

mav.getModel().get("model");
mav.getModel().containsKey("model");
Run Code Online (Sandbox Code Playgroud)

你在你的控制器中调用了你的模型图"模型"......

在你的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>
Run Code Online (Sandbox Code Playgroud)