【发布时间】: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