Spring 集成测试中未注入自定义过滤器

nic*_*esh 5 spring integration-testing filter

我有一个集成测试,旨在启动我的 Spring Boot 应用程序:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = AppConfigCorrelationIdTestIt.class)
@WebIntegrationTest("server.port:0")
public class CorrelationIdTestIT {
Run Code Online (Sandbox Code Playgroud)

配置类在哪里:

@EnableConfigurationProperties
@ComponentScan
@EnableAutoConfiguration
@Configuration
public class AppConfigCorrelationIdTestIt {
Run Code Online (Sandbox Code Playgroud)

在应用程序中,我有一个定义的自定义 servlet 过滤器:

public class CorrelationHeaderFilter implements Filter {
Run Code Online (Sandbox Code Playgroud)

但是在测试我的应用程序时,我发现客户过滤器没有被实例化并注入到过滤器链中。我发现解决此问题的唯一方法是手动将其创建为 中的 bean AppConfigCorrelationIdTestIt,然后它就可以完美运行。

@Bean
public CorrelationHeaderFilter correlationHeaderFilter() {
    return new CorrelationHeaderFilter();
}
Run Code Online (Sandbox Code Playgroud)

任何想法为什么在应用程序启动时 Spring Boot 没有选择过滤器?

谢谢

Mak*_*vol 6

通常,在测试类中可能使用 DefaultMockMvcBuilder。addFilter (Filter filter, String... urlPatterns) 当配置 MockMvc 时。例如:

@WebAppConfiguration
@ContextConfiguration
public class AuthenticationTest {

private static final String TOKEN_HEADER = "X-Firebase-Auth";

final String url = "http://localhost:8080/authentication";

final Logger logger = LoggerFactory.getLogger(AuthenticationTest.class);

@Autowired
private WebApplicationContext webApplicationContext;

@Autowired
public Filter springSecurityFilterChain;

private MockMvc mockMvc;

@Before
public void setUp(){
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
            .addFilter(springSecurityFilterChain).build();
}
...

}
Run Code Online (Sandbox Code Playgroud)

我基于这个答案