gpt4 book ai didi

java - 相关 ID 的单元测试 doFilter

转载 作者:行者123 更新时间:2023-12-01 19:47:20 25 4
gpt4 key购买 nike

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

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

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

以下是过滤器:

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 的响应时。检查是否已将其连同响应一起发回。

谁能告诉我如何做到这一点?

我尝试使用模拟,但我的响应头中没有任何内容。

@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 = mock(
CorrelationIdServletFilter.class);
CorrelationIdServletFilter.init(mock(FilterConfig.class));

CorrelationIdServletFilter.doFilter(httpServletRequest, httpServletResponse,
filterChain);


System.out.println(httpServletResponse.getHeaderNames());

CorrelationIdServletFilter.destroy();

verify(CorrelationIdServletFilter, times(1))
.doFilter(httpServletRequest, httpServletResponse, filterChain);

}

有什么办法可以做到这一点吗?任何帮助将非常感激。有没有办法在没有模拟的情况下做到这一点?

最佳答案

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

  1. 被测类永远不会被模拟(可能有一些异常(exception)),因为您想要对被测类的各种方法进行实际调用以进行单元测试。
  2. 我们应该始终为被测类的不同方法编写单独的单元测试。在这里我可以看到您还调用了 initdestroy 方法,当您想要测试 doFilter 方法时,不需要这些方法。<
  3. 当我们创建任何模拟对象时,我们使用期望来定义我们期望对模拟对象进行的调用,并让它们返回一些 stub 值(如果需要)。

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

@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);

}

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

关于java - 相关 ID 的单元测试 doFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52684664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com