java - 如何编写集成测试来检查 MDC 上下文中的内容?
问题描述
这是我用来向标题添加过滤器并添加 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 并验证它。可能吗 ?
解决方案
你想做的事情有点复杂,但一个可能的解决方案是使用参数捕获器。
例如:
public class ReqTxIdFilterImpl implements Filter {
@Override
public void doFilter(...) {
// rest of code
addIdToMdc(requestTxId);
filterChain.doFilter(servletRequest, servletResponse);
MDC.clear();
}
protected void addIdToMdc(String requestTxId) {
MDC.put("txId", requestTxId);
}
}
在测试类中:
@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
推荐阅读
- r - 将所有观察结果的 Shapley 原因代码附加到整个数据
- pentaho - PDI /Kettle - 将数据从前一跳传递到数据库查询
- python-3.x - 为什么 set_index 之后值会发生变化?
- python - 为什么两个相同的字符串在比较时返回的结果不一样?
- jobs - 如何在凌晨 02:00 后停止或终止工作
- java - 由文本文件填充的二叉搜索树的搜索键 (Java)
- php - 返回“无法发布 /index.php”的 HTML 按钮
- php - 添加参数的功能不起作用
- bootstrap-4 - 无法触发引导工具提示或弹出框内的按钮
- mysql - 2个循环使用reactjs(前端)和nodejs / expressjs(后端)在我的数据库(mysql)中插入数据