簡體   English   中英

Spring 過濾器鏈未應用於單元測試 MockMvc

[英]Spring filter chain is not applied on unit test MockMvc

我做了一個自定義過濾器並在 WebConfig 上注冊,但是當我調用 api 時,過濾器沒有被調用。 我查看了日志,似乎我在配置中描述的過濾器鏈沒有應用。 但是我檢查了 WebConfig 是使用調試器調用的。

//MyFilter.java
@Component
public class MyFilter implements Filter {
  @Override
  doFilter(...) { // This part is NOT getting invoked
    ...
  }
}
//WebConfig.java
@Configuration
public class WebConfig {
  @Bean
  public FilterRegistrationBean<MyFilter> myFilter() { // This part is getting invoked
    regBean = new FilterRegistrationBean();
    regBean.setFilter(new MyFilter());
    regBean.setOrder(0);
    return regBean;
  }
}
//MyTest.java
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyApplication.class)
public class MyTest {
  
  private MockMvc mockMvc;

  @Autowired
  WebApplicationContext ctx;

  @Before
  public void before() {
    mockMvc = MockMvcBuilders.webApplicationSetup(ctx).build();
  }

  @Test
  public void doTest() {
    mockMvc.perform(...);
  }
}
this.mockMvc = MockMvcBuilders.webApplicationSetup(ctx)
            .addFilters(filter).build();

如果您不使用@AutoConfiguraMockMvc,那么您必須將過濾器添加到 mockMvc 構建器。

使 mockMVC 測試過濾器的 init 例程需要什么?

這里也存在配置問題。

@Bean
  public FilterRegistrationBean<MyFilter> myFilter(MyFilter myfilter) { // This part is getting invoked
    regBean = new FilterRegistrationBean();
    regBean.setFilter(myFilter);
    regBean.setOrder(0);
    return regBean;
  }

您正在將過濾器的新實例放入過濾器鏈,但您創建了 singleton 過濾器。 您可以使用上述配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM