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 构建器添加过滤器。
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;
}
您正在将过滤器的新实例放入过滤器链,但您创建的是单例过滤器。你可以使用上面的配置。
我制作了一个自定义过滤器并在 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 构建器添加过滤器。
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;
}
您正在将过滤器的新实例放入过滤器链,但您创建的是单例过滤器。你可以使用上面的配置。