Как написать интеграционный тест для проверки содержимого в контексте MD C? - PullRequest
1 голос
/ 06 января 2020

Вот код, который я использую, чтобы добавить фильтр к заголовкам и добавить 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();
    }
}

Я использую весеннюю загрузку и Mock Mvc для тестирования 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"));
    }

I также хотите проверить контекст MD C и проверить, установлен ли этот test-id как txId в контекстной карте MD C, и проверить его. Возможно ли это?

1 Ответ

1 голос
/ 06 января 2020

То, что вы хотите сделать, немного сложно, но возможное решение - использовать захват аргумента.

Например:

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, который я не уверен, выполнимо ли это в вашем случае.

Альтернативное решение заключается в извлечении логики c для составления этого Id в другой компонент и тестировании этого класса или вызове для него ResultCaptor .: { ссылка }

...