Spring MVC测试框架:为什么不测试调度程序servlet

时间:2014-05-15 07:08:52

标签: java spring spring-mvc

我有:琐碎的Spring MVC示例应用。我将DispatcherServlet配置为处理以dispatcher/开头的所有请求。

问题:部署到Tomcat后,如果我尝试转到localhost:8080页面,我会The requested resource (/) is not available.。但我可以通过localhost:8080/dispatcher路径。

问题:

  1. 如果simple代替mockMvc.perform(get("/")),为什么mockMvc.perform(get("/dispatcher"))测试有效?
  2. 代码:

    的web.xml:

        <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/dispatcher/*</url-pattern>
    </servlet-mapping>
    

    控制器:

    @Controller
    @RequestMapping("/")
    public class HelloController {
        @RequestMapping(method = RequestMethod.GET)
        public String printWelcome(ModelMap model) {
            model.addAttribute("message", "Hello world!");
            return "hello";
        }
    }
    

    测试:

    @Test
    public void simple() throws Exception {
        mockMvc.perform(get("/"))
                .andExpect(status().isOk())
                .andExpect(model().attribute("message", "Hello world!"))
                .andExpect(view().name("hello"));
    }
    

2 个答案:

答案 0 :(得分:2)

  

问题:部署到Tomcat之后,如果我尝试转到localhost:8080   页面我得到请求的资源(/)不可用..但我可以去   通过localhost:8080 /调度程序路径。

从Servlet容器的角度访问您的控制器 - 当您键入localhost时,您正在执行的操作:8080 / dispatcher - 需要在url路径中提供大量信息。例如,您的HelloController

  1. 配置为由mvc-dispatcher Servlet
  2. 处理
  3. mvc-dispatcher Servlet在Web应用程序中声明(由您的web.xml定义)
  4. 您的网络应用程序中可能有多个Servlet
  5. 将Web应用程序部署到您的Servlet容器(Tomcat)
  6. Servlet容器中可能有多个Web应用程序
  7. 当你考虑所有这些时,解决网址有很多含糊之处。正如@san krish指出的那样,并假设您已将应用程序部署到Tomcat的根上下文,您可以强制执行mvc-dispatcher所有内容并将其映射到/ *作为默认值,并最终为您的HelloController提供服务localhost:8080/

      

    如果我们改为使用mockMvc.perform(get(“/”)),为什么简单测试会起作用   mockMvc.perform(get(“/ dispatcher”))?

    在测试中从mockMvc访问您的控制器是非常本地化的。根据您的测试设置方式,可以从以下位置创建MockMvc实例:

    1. MockMvcBuilders.standaloneSetup(控制器) - 这里您的控制器直接传递给测试进行测试,因此MockMvc对mvc-dispatcher及其“/ dispatcher”路径一无所知。
    2. MockMvcBuilders.webAppContextSetup(webApplicationContext) - 此处,测试类使用@ContextConfiguration注释,指向您的“mvc-dispatcher”xml或@Configuration类。在这种情况下,MockMvc将对“mvc-dispatcher”下的所有内容进行操作,因此无需在路径中引用“调度程序”。

答案 1 :(得分:1)

web.xml地图中显示通配符

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

它会将所有正在进行的请求传递给调度程序servlet