为了账号安全,请及时绑定邮箱和手机立即绑定

单元测试 doFilter 的相关性 ID

单元测试 doFilter 的相关性 ID

慕田峪7331174 2021-11-03 14:20:12
我正在使用 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() {}}我需要编写单元测试来涵盖两种情况:发送请求时没有关联 ID。检查在服务器端生成的 id。当发送带有相关 ID 的响应时。检查它是否与响应一起发回。谁能指出我如何做到这一点?
查看完整描述

1 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您编写的测试的一些主要问题:

  1. 被测类永远不会被嘲笑(可能有一些例外),因为您想对被测类的各种方法进行单元测试的实际调用。

  2. 我们应该始终为被测类的不同方法编写单独的单元测试。在这里,我可以看到您还调用了initdestroy方法,而当您要测试该doFilter方法时不需要这些方法。

  3. 当我们创建任何模拟对象时,我们使用期望来定义我们期望对模拟对象进行的调用,并在需要时让它们返回一些存根值。

现在,我已经尝试编写正确的测试来断言您要测试的两种情况:

@Test

public 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 request


Capture capturedCorrelationIdRaw = newCapture();


httpServletResponse.addHeader(CORRELATION_ID_HEADER_NAME, capture(capturedCorrelationIdRaw));

expectLastCall(); // used for void methods in EasyMock framework


filterChain.doFilter(httpServletRequest, httpServletResponse);

expectLastCall();


CorrelationIdServletFilter.doFilter(httpServletRequest, httpServletResponse,

    filterChain);



assertNotEmpty(capturedCorrelationIdRaw.getValue());



verify(httpServletRequest, times(1))

    .getHeader(CORRELATION_ID_HEADER_NAME);

verify(httpServletResponse, times(1))

    .addHeader(CORRELATION_ID_HEADER_NAME, anyString);


}

该测试需要根据所使用的实际测试框架进行更新,但我已尽力让您了解测试应该是什么样子。


查看完整回答
反对 回复 2021-11-03
  • 1 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信