Я работаю над сборкой приложения, используя dropwizard.
Я создал фильтр для перехвата и регистрации идентификатора корреляции вызывающей службы.
Если во входящем запросе нет заголовка «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 корреляции.Убедитесь, что идентификатор генерируется на стороне сервера.
Когда отправляется ответ с идентификатором корреляции.Проверьте, что оно отправлено обратно с ответом.
Может кто-нибудь указать мне, как это можно сделать?
Я пытался использовать макет, но у меня нет ответа, в котором ничего нетheader.
@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);
}
Есть ли способ сделать это?Любая помощь могла бы быть полезна.Есть ли способ это без насмешки?