从urlstring创build一个模拟HttpServletRequest?

我有一个服务,在HttpServletRequest对象上做了一些工作,特别是使用request.getParameterMap和request.getParameter构造一个对象。

我想知道是否有一个简单的方法来提供一个stringforms的url,说

String url = "http://www.example.com/?param1=value1&param"; 

并轻松地将其转换为HttpServletRequest对象,以便我可以用我的unit testing进行testing? 或者至less只是这样,request.getParameterMap和request.getParameter工作正常?

Spring的spring-test模块中有MockHttpServletRequest 。

如果你正在使用maven,你可能需要添加适当的依赖到你的pom.xml 。 你可以在mvnrepository.com上findspring-test。

最简单的方法来模拟一个HttpServletRequest

  1. 创build一个匿名子类:

     HttpServletRequest mock = new HttpServletRequest () { private final Map<String, String[]> params = /* whatever */ public Map<String, String[]> getParameterMap() { return params; } public String getParameter(String name) { String[] matches = params.get(name); if (matches == null || matches.length == 0) return null; return matches[0]; } // TODO *many* methods to implement here }; 
  2. 使用jMock , Mockito或其他通用的模拟框架:

     HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito 
  3. 使用HttpUnit的ServletUnit ,不要模拟请求。

这里是如何使用MockHttpServletRequest:

 // given MockHttpServletRequest request = new MockHttpServletRequest(); request.setServerName("www.example.com"); request.setRequestURI("/foo"); request.setQueryString("param1=value1&param"); // when String url = request.getRequestURL() + '?' + request.getQueryString(); // assuming there is always queryString. // then assertThat(url, is("http://www.example.com:80/foo?param1=value1&param")); 

您通常会在集成testing中testing这些types的东西,这个testing实际上连接到一个服务。 要进行unit testing,您应该testingservlet的doGet / doPost方法所使用的对象。

一般来说,你不想在你的servlet方法中有太多的代码,你可能想创build一个bean类来处理操作,并把你自己的对象传递给它,而不是servlet API对象。