如何编写集成测试以检查MDC上下文中的内容?

问题描述 投票:1回答:1

这是我用于将过滤器添加到标题并添加UUID的代码

@Slf4j
public class ReqTxIdFilterImpl implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        List<String> headerNames = Collections.list(request.getHeaderNames());
        String requestTxId = "";
        if(!headerNames.isEmpty()){
            requestTxId = request.getHeader(
                    headerNames.stream()//
                            .filter(header -> header.contains("txId"))
                            .findAny()
                            .orElse("")//
                    );
        }
        if (StringUtils.isEmpty(requestTxId)) {
            requestTxId = UUID.randomUUID().toString();
        }
        MDC.put("txId", requestTxId);
        filterChain.doFilter(servletRequest, servletResponse);
        MDC.clear();
    }
}

我使用spring boot和MockMvc来测试API

@Autowired
    private MockMvc mockMvc;

    @Test
    public void test_generatePolicyNumber() throws Exception {
        MvcResult mvcResult = this.mockMvc.perform(post("/test"))
                .header("txId", "test-id")
                .andDo(print()).andExpect(status().isOk())
                .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
                .andReturn();
        Assert.assertTrue(mvcResult.getResponse().getContentAsString().contains("test"));
    }

我还想检查MDC上下文,并检查此test-id是否在MDC上下文映射中设置为txId并进行验证。有可能吗?

java spring-boot logback mdc
1个回答
0
投票
在测试班级:

@Test public void test_generatePolicyNumber() throws Exception { ... ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); Mockito.verify(filter).addIdToMdc(captor.capture()); //get the String object added to MDC using ArgumentCaptor String actual = captor.getValue(); Assert.assertThat(actual).isEqualTo(expectedId); }

请注意,您需要在TestClass中注入过滤器。

一种替代方法是提取用于将该ID组成另一个逻辑并测试该类或为其调用ResultCaptor的逻辑,例如:https://stackoverflow.com/a/25694142/8794926
© www.soinside.com 2019 - 2024. All rights reserved.