【问题标题】:Spring filter chain is not applied on unit test MockMvc弹簧过滤器链不适用于单元测试 MockMvc
【发布时间】:2021-12-29 01:56:24
【问题描述】:

我做了一个自定义过滤器并在 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(...);
  }
}

【问题讨论】:

  • 删除@ContextConfiguration,添加@AutoConfigureMockMvc。放弃 @Before 注释方法并将 @Autowired 添加到 MockMvc 字段。然后重新运行测试。
  • 删除 @ContextConfiguration 会导致 IllegalStateException 没有它我无法运行测试。
  • 这很奇怪,因为它应该自动检测 @SpringBootApplication 注释类(除非你有一些奇怪的非标准包装结构)。您能否将异常(完整异常堆栈跟踪)作为更新添加到您的问题中。
  • 在你的测试中真的是这样吗? @ContextConfiguration(classes = MyApplication.class)@ContextConfiguration(classes = WebConfig.class) 还是您发布的示例?
  • 最好使用@AutoConfiguraMockMvc,你可以在集成测试中自动装配它

标签: java spring spring-boot junit


【解决方案1】:
this.mockMvc = MockMvcBuilders.webApplicationSetup(ctx)
            .addFilters(filter).build();

如果您不使用@AutoConfiguraMockMvc,那么您必须向 mockMvc 构建器添加过滤器。

What's required to make mockMVC test a filter's init routine?

这里也有配置问题。

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

您正在将过滤器的新实例放入过滤器链,但您创建了单例过滤器。你可以使用上面的配置。

【讨论】:

  • 感谢FilterRegistrationBean 他现在实际上向链中添加了 2 个过滤器。但是,当使用@SpringBootTest 时,您应该使用@AutoConfigureMockMvc 以便应用过滤器等的正确配置。
  • 我添加了这行句子:“如果你不使用@AutoConfiguraMockMvc,那么你必须在mockMvc builder中添加过滤器。”
猜你喜欢
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2013-04-23
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多