【问题标题】:How to unit test spring mvc interceptors without controller class如何在没有控制器类的情况下对 spring mvc 拦截器进行单元测试
【发布时间】:2014-03-25 05:27:53
【问题描述】:

我正在尝试为我的 spring-mvc REST 应用程序中的一个拦截器编写一个单元测试。我正在使用:

- 测试NG 6.8.7 - Mockito 1.9.5 - 春天 4.0.0

必须让控制器对拦截器进行单元测试吗?不写控制器可以写单元测试吗?

谢谢,NN

【问题讨论】:

  • 你能展示一下你是如何使用MockMvc 来测试你的拦截器的吗?

标签: java spring unit-testing spring-mvc


【解决方案1】:

假设你的意思是HandlerInterceptor

是否必须让控制器对拦截器进行单元测试?

没有。单元测试旨在尽可能地自包含。如果您正在对HandlerInterceptor 实现进行单元测试,那么所涉及的唯一内容就是您的实现及其所有依赖项。

我们可以在不编写控制器的情况下编写单元测试吗?

是的。 HandlerInterceptor 只是一个包含三 (3) 个方法的接口。这些方法都需要控制器,所以你不需要控制器。

【讨论】:

    【解决方案2】:

    是否必须让控制器对拦截器进行单元测试?

    没有。不是!

    我们可以在不编写控制器的情况下编写单元测试吗?

    是的。可以!,如下图。

    1. 设置 Web 应用程序上下文。
    2. 获取处理程序映射 bean。
    3. 获取处理程序执行链。
    4. 遍历拦截器并调用preHandle方法。
    5. 调用控制器的handleRequest方法。
    6. 遍历拦截器并调用postHandle 方法。

      受保护的 void setUp() 抛出异常 { super.setUp();

          String[] configFiles = new String[] {
                  "file:///c:/abc.xml",
                   };
      
          /*
           * Ref: http://www.koders.com/java/fid78745323A147B238F4B366225C31603C6F87CE75.aspx?s=%22Seth+Ladd%22
           */
          MockServletContext sctx = new MockServletContext("");
          ctx = new XmlWebApplicationContext();
          ctx.setServletContext(sctx);
      
          ctx.setConfigLocations(configFiles);
          ctx.refresh();
      }
      
      private void testRequest(HttpServletRequest request, HttpServletResponse response){
      
          try {
              MockHttpServletRequest request = new MockHttpServletRequest("GET","/urlpath/soemname");
              MockHttpServletResponse response = new MockHttpServletResponse();
      
              request.setServerName("www.domainname.com");
      
              HandlerMapping handlerMapping = (HandlerMapping) this.getCtx().getBean("beanname");
      
              HandlerExecutionChain hec = handlerMapping.getHandler(request);
              Controller handler = (Controller) hec.getHandler();
      
              HandlerInterceptor interceptors[] = hec.getInterceptors();
      
              /*
               * Calling preHandle on interceptors
               */
              for(int i=0; i < interceptors.length; i++){
      
                  interceptors[i].preHandle(request, response, handler);
              }
      
              /*
               * calling the controller handleRequest
               */
              ModelAndView modelAndView = handler.handleRequest(request, response);
      
              /*
               * Calling postHandle on interceptors
               */
              for(int i=0; i < interceptors.length; i++){
                  interceptors[i].postHandle(request, response, handler, modelAndView);
              }
      
              /*
               * Validating the response
               */
      
          } catch (Exception e) {
              e.printStackTrace();
              fail();
          }
      }
      

    来源:http://forum.spring.io/forum/spring-projects/web/43787-testing-handlerinterceptors-and-controllers

    希希尔

    【讨论】:

    • 小心,你的例子不是单元测试。这是一个集成测试。
    • 哦!对不起,我没有意识到这一点。尽管过程将保持不变,但我将发布正确的示例代码。感谢您指出。
    • @SotiriosDelimanolis,我现在也注意到了。这不是单元测试。我的第一个问题是Is it mandatory to have controllers to unit test the interceptors?,这里的每个人都回答了NO,然而,在示例和论坛链接中,他们正在调用ModelAndView modelAndView = handler.handleRequest(request, response); 来测试拦截器。这与使用MockMvc 为控制器编写单元测试一样好,它比这更干净、更简单。我已经在这样做了。我想要的只是一种在筒仓中测试拦截器的不同方法。无论如何,我认为这个线程已经关闭。
    • 正如@SotiriosDelimanolis 所说,“如果您正在对 HandlerInterceptor 实现进行单元测试,那么唯一涉及的就是您的实现及其所有依赖项”。所以你不需要控制器。正如你所说,MockMvc 方法比这个例子更好,如果你去进行集成测试
    • 源链接不再有效。
    猜你喜欢
    • 2010-11-05
    • 2020-05-10
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多