我是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}等
所以我需要知道两件事中的至少一件(但如果你能回答两件事,那就更好了):
感谢任何帮助。
答案 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")