2016-11-03 19 views
1

我写了一个泽西岛请求过滤器,我想单元测试它。以下是代码。如何从java中的泽西模拟requestContext.getUriInfo()。getPathParameters()

`@Override 
    public void filter(ContainerRequestContext containerRequestContext) throws IOException { 
     logPathParameters(containerRequestContext); 
    } 

    private void logPathParameters(ContainerRequestContext requestContext) { 
     StringBuilder parameterStringBuilder = new StringBuilder(); 
     MultivaluedMap<String, String> pathParameters= requestContext.getUriInfo().getPathParameters(); 

     if(!pathParameters.isEmpty()) { 
      Iterator iterator = pathParameters.keySet().iterator(); 

      while (iterator.hasNext()) { 
       String name = iterator.next().toString(); 
       String paramValue = pathParameters.getFirst(name); 
       String shortParamName = getShortNameForPathParameter(name); 
       parameterStringBuilder.append(String.format("paramName: %s, paramValue: %s; ", shortParamName, paramValue)); 
      } 
      if (parameterStringBuilder.length() > 0) { 
       MDC.put("pathParam ", parameterStringBuilder.toString()); 
       System.out.println(parameterStringBuilder.toString()); 
      } 
     } 
    }` 

要单元测试上面的过滤函数我必须模拟ContainerRequestContext。所以我创建了下面的函数。

private ContainerRequestContext mockContainerRequest(String uri) throws URISyntaxException { 
     ContainerRequestContext requestContext = mock(ContainerRequestContext.class); 
     UriInfo uriInfo = mock(UriInfo.class); 
     URI requestUri = new URI(uri); 
     when(uriInfo.getRequestUri()).thenReturn(requestUri); 
     when(requestContext.getUriInfo()).thenReturn(uriInfo); 
     return requestContext; 
    } 

在这里,我想嘲笑uriInfo的getPathParameters,这将返回存在于输入URI字符串给这个函数路径参数。 是否有任何实用功能可以为我做到这一点。就像我将url传递给它,它应该返回路径参数的多值图。

在下面的问题的答案中提到了类似的东西。

example

这是查询参数进行。我想为路径参数做这件事。我不想手动构建它。某种效用函数应该是好的。

+0

如果你要求的是一个效用函数,那么这个问题是无关紧要的。如果你试图自己解决它并且遇到问题,那么[描述问题](http://meta.stackoverflow.com/questions/254393)以及到目前为止已经做了什么来解决它。 – Nkosi

+0

但是我相信你忘记它只是一个模拟,所以你基本上可以返回你想要测试的地图 – Nkosi

回答

0

如果提出一个算法被证明是一个障碍,那么只需制作一个假地图来表示路径参数。

private ContainerRequestContext mockContainerRequest(String uri, MultivaluedMap<String, String> pathParameters) throws URISyntaxException { 
    ContainerRequestContext requestContext = mock(ContainerRequestContext.class); 
    UriInfo uriInfo = mock(UriInfo.class); 
    URI requestUri = new URI(uri); 
    when(uriInfo.getRequestUri()).thenReturn(requestUri); 
    when(uriInfo..getPathParameters()).thenReturn(pathParameters); 
    when(requestContext.getUriInfo()).thenReturn(uriInfo); 

    return requestContext; 
} 

从那里安排测试时,你可以使用代表/与测试uri匹配的段填充它。

+0

你将MultivaluedMap pathParameters作为函数参数传递给mockContainerRequest函数。我不想要这个。我需要另一个函数,它将uri作为输入参数并返回MultivaluedMap pathParameters作为输出。我将在mockContainerRequest函数中使用它 – Sachin