代码之家  ›  专栏  ›  技术社区  ›  Samo

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

  •  3
  • Samo  · 技术社区  · 15 年前

    我刚接触SpringMVC,正在学习如何测试我的控制器。我有一个简单的测试:

    @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的显示窗口中,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”)返回空值,containskey(“companyinfo”)返回假值。

    当我用未注释的部分替换控制器的注释部分时,我的测试工作得很好,但随后我的JSP视图中断,因为我试图通过说出诸如$model.companyinfo_等内容来访问模型的属性。

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

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

    任何帮助都是值得赞赏的。

    4 回复  |  直到 13 年前
        1
  •  10
  •   sanimalp    13 年前

    对于问题1,模型提供了一个方法,该方法将模型属性作为映射返回。在测试中,您可以执行以下操作:

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

    假设您将companyInfo设置到模型中,它应该在模型中。

    至于问题的第二部分,我想已经有人回答了。

        2
  •  6
  •   pedrofalcaocosta    15 年前

    好了,现在清楚了!

    尝试:

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

    您在控制器中调用了模型映射“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>
    
        3
  •  1
  •   pedrofalcaocosta    15 年前

    忘记了用视图名调用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"));
    }
    

    如果需要使用自定义键添加多个对象,请改用add object方法;

      mav.addObject("key1", 1);
      mav.addObject("key2", 2);
    
        4
  •  1
  •   Samo    15 年前

    @佩德罗法卡科斯塔,我给你的答案投赞成票,因为这有助于我找到答案,但我认为在这里回答我自己的问题是合适的:

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