Java 从控制器测试的上下文访问ModelAndView对象中包含的模型属性
我是SpringMVC的新手,我正在学习如何测试我的控制器。我有一个简单的测试:Java 从控制器测试的上下文访问ModelAndView对象中包含的模型属性,java,spring-mvc,junit,Java,Spring Mvc,Junit,我是SpringMVC的新手,我正在学习如何测试我的控制器。我有一个简单的测试: @Test public void shouldDoStuff() { request.setRequestURI("/myCompany/123"); ModelAndView mav = controller.getSomeDatas("123", request); assertEquals(mav.getViewName(), "company"); assertTrue(m
@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);
}
但是,访问该模型中的值的任何尝试都将失败。例如,我假设以下方法可行:
mav.getModel().get("companyInfo")
null
mav.getModel().containsKey("companyInfo")
(boolean) false
但是正如您所看到的,get(“companyInfo”)返回null,containsKey(“companyInfo”)返回false
当我将控制器的注释部分与未注释部分交换时,我的测试工作正常,但随后我的jsp视图中断,因为我试图通过说${model.companyInfo}等来访问模型的属性
因此,我需要知道两件事中的至少一件(但如果你能同时回答这两件事,那就更好了):
非常感谢您的帮助。您忘记了使用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);
好了,现在清楚了
尝试:
您在控制器中调用了modelmap“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>
${model.companyInfo}
@Pedrofalcaocata,我对你的答案投赞成票,因为它帮助我找到了我的答案,但我认为在这里回答我自己的问题是合适的:
((java.util.HashMap<String,Object>)mav.getModel().get("model")).get("companyInfo")
((java.util.HashMap)mav.getModel().get(“model”).get(“companyInfo”)
对于问题1,Model提供了一种方法,可以将模型属性作为映射返回。在测试中,您可以执行以下操作:
Map<String,Object> modelMap = mav.getModel().asMap();
modelMap.get("companyInfo");
Map modelMap=mav.getModel().asMap();
modelMap.get(“companyInfo”);
假设您将companyInfo设置到模型中,它应该在那里
至于问题的第二部分,我想已经有人回答了 很明显的答案是你的控制器坏了,测试正在进行。没有看到你的控制器代码,这就是我所能建议的,我已经更新了我的问题,包括我的控制器代码。无论哪种方式,对象显然包含我所寻找的值这一事实似乎与我无法从中检索该值这一事实相矛盾,您是否同意?我可以理解为什么这会起作用,但我不理解的是:getSomeDatas()应该返回ModelAndView对象。它返回的对象清楚地包含我添加到其中的值,如上图所示。为什么我不能从中检索这些值?为什么我要在测试中创建一个新的ModelAndView对象,并从控制器中添加对象,而我的控制器应该返回这个ModelAndView对象及其包含的值?感谢提示,这很有帮助,但不是很有用:)它确实帮助我找到了答案,但是我发布了实际的答案,希望它能帮助其他遇到同样问题的开发人员。很抱歉,答案不完整,但是你问题的更新让我有点困惑。。。我知道问题出在“模特”的名下。无论如何不客气!
((java.util.HashMap<String,Object>)mav.getModel().get("model")).get("companyInfo")
Map<String,Object> modelMap = mav.getModel().asMap();
modelMap.get("companyInfo");