从url字符串创建模拟HttpServletRequest?

Ant*_*ony 60 java servlets mocking

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

我想知道是否有一种直接的方式来获取提供的URL,以字符串的形式,比如说

String url = "http://www.example.com/?param1=value1&param";
Run Code Online (Sandbox Code Playgroud)

并轻松将其转换为HttpServletRequest对象,以便我可以使用单元测试进行测试?或者至少只是为了让request.getParameterMap和request.getParameter正常工作?

pap*_*pap 41

Spring 在其spring-test模块中有MockHttpServletRequest.

如果您使用的是maven,则可能需要在pom.xml中添加适当的依赖项.您可以在mvnrepository.com找到spring-test .

  • 我不能让这个工作.该如何使用? (2认同)

Mat*_*all 38

最简单的模拟方法HttpServletRequest:

  1. 创建一个匿名子类:

    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
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用jMock,Mockito或其他一些通用的模拟框架:

    HttpServletRequest mock = context.mock(HttpServletRequest.class); // jMock
    HttpServletRequest mock2 = Mockito.mock(HttpServletRequest.class); // Mockito
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用HttpUnit的ServletUnit并且根本不模拟请求.


Gui*_*ito 34

这是如何使用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"));
Run Code Online (Sandbox Code Playgroud)

  • 请注意,设置queryString时,MockHttpServletRequest中的参数Map不会自动更新。因此,如果您在代码中使用request.getParameter(),则必须首先在测试设置中显式设置它,即使一开始可能看起来很多余。 (2认同)