单元测试 doFilter 的相关性 ID

我正在使用 dropwizard 构建应用程序。


我做了一个过滤器来拦截和记录调用服务的相关 ID。


如果传入请求的标头中没有标头“Correlation-Id”,我们将在响应中附加一个标头。


以下是过滤器:


public class CorrelationIdServletFilter implements Filter {


private static final Logger LOGGER =

  LoggerFactory.getLogger(CorrelationIdServletFilter.class);


 private static final String CORRELATION_ID_HEADER_NAME = "Correlation-ID";


 private static final String CORRELATION_ID_MDC_KEY = " ";


 private static final InheritableThreadLocal<String> correlationId =

  new InheritableThreadLocal<>();


  public static String getCorrelationId() {

return correlationId.get();

 }


 @Override

 public void init(FilterConfig filterConfig) throws ServletException {}


 @Override

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

  throws IOException, ServletException {


try {

  HttpServletRequest req = (HttpServletRequest) request;


  HttpServletResponse res = (HttpServletResponse) response;


  String correlationIdHeaderValue = req.getHeader(CORRELATION_ID_HEADER_NAME);


  LOGGER.debug

      (

      "HTTP Header("

          + CORRELATION_ID_HEADER_NAME

          + ") = ["

          + correlationIdHeaderValue

          + "] will generate a new correlationId if incoming is NULL");


  String correlationIdRaw;


  if (!StringUtils.isEmpty(correlationIdHeaderValue)) {

    correlationIdRaw = correlationIdHeaderValue;

  } else {

    correlationIdRaw = UUID.randomUUID().toString();

  }


  LOGGER.debug("Request: (" + req.getRequestURI() + ") is marked as :" + correlationIdRaw);


  correlationId.set(correlationIdRaw);


  MDC.put(CORRELATION_ID_MDC_KEY, getCorrelationId());


  res.addHeader(CORRELATION_ID_HEADER_NAME, correlationIdRaw);


  LOGGER.debug(

      "Response holds correlationId : ("

          + res.getHeader("Correlation-ID")

          + ") in its header ");


  chain.doFilter(req, res);


} finally {

  correlationId.remove();

  MDC.remove(CORRELATION_ID_MDC_KEY);

}

}


  @Override

  public void destroy() {}

}

我需要编写单元测试来涵盖两种情况:

  1. 发送请求时没有关联 ID。检查在服务器端生成的 id。

  2. 当发送带有相关 ID 的响应时。检查它是否与响应一起发回。

谁能指出我如何做到这一点?


慕田峪7331174
浏览 235回答 1
1回答

慕田峪9158850

您编写的测试的一些主要问题:被测类永远不会被嘲笑(可能有一些例外),因为您想对被测类的各种方法进行单元测试的实际调用。我们应该始终为被测类的不同方法编写单独的单元测试。在这里,我可以看到您还调用了init和destroy方法,而当您要测试该doFilter方法时不需要这些方法。当我们创建任何模拟对象时,我们使用期望来定义我们期望对模拟对象进行的调用,并在需要时让它们返回一些存根值。现在,我已经尝试编写正确的测试来断言您要测试的两种情况:@Testpublic void testResponse_for_RequestWithoutCcid() throws IOException, ServletException {HttpServletRequest httpServletRequest = mock(HttpServletRequest.class);HttpServletResponse httpServletResponse = mock(HttpServletResponse.class);FilterChain filterChain = mock(FilterChain.class);CorrelationIdServletFilter correlationIdServletFilter = new CorrelationIdServletFilter();expect(httpServletRequest.getHeader(CORRELATION_ID_HEADER_NAME)).andReturn(""); // Empty correlation id in the requestCapture capturedCorrelationIdRaw = newCapture();httpServletResponse.addHeader(CORRELATION_ID_HEADER_NAME, capture(capturedCorrelationIdRaw));expectLastCall(); // used for void methods in EasyMock frameworkfilterChain.doFilter(httpServletRequest, httpServletResponse);expectLastCall();CorrelationIdServletFilter.doFilter(httpServletRequest, httpServletResponse,&nbsp; &nbsp; filterChain);assertNotEmpty(capturedCorrelationIdRaw.getValue());verify(httpServletRequest, times(1))&nbsp; &nbsp; .getHeader(CORRELATION_ID_HEADER_NAME);verify(httpServletResponse, times(1))&nbsp; &nbsp; .addHeader(CORRELATION_ID_HEADER_NAME, anyString);}该测试需要根据所使用的实际测试框架进行更新,但我已尽力让您了解测试应该是什么样子。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java