Spring AbstractSecurityWebApplicationInitializer 未在集成测试中启动

aka*_*_sh 3 java spring integration-testing spring-security spring-test

我有自定义初始值设定项,它扩展AbstractSecurityWebApplicationInitializer. 它在过滤器链的开头添加了几个过滤器。

@Order(2)
public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding(StandardCharsets.UTF_8.name());
        characterEncodingFilter.setForceEncoding(true);
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        insertFilters(servletContext, characterEncodingFilter, hiddenHttpMethodFilter);
    }
}
Run Code Online (Sandbox Code Playgroud)

在生产中,它按预期工作。但是我不能让它在集成测试环境中启动(或者更好地说:让 Spring 加载它)。这是测试的片段:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {ApplicationConfiguration.class, FakeInMemoryMongoConfiguration.class, WebConfiguration.class})
@ActiveProfiles("test")
public class CarPartControllerIntegrationTest {
    @Autowired
    private WebApplicationContext wac;
    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        mockMvc = webAppContextSetup(wac).build();
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

即,SecurityApplicationInitializer.beforeSpringSecurityFilterChain()在测试期间不调用。现在我决定在测试的过滤器链中手动添加过滤器。但我认为应该有更好的解决方案。

请帮助让世界变得更好:)谢谢!

csh*_*non 5

如果您使用 MockMvc,则需要为您的测试配置 Spring Security。您可以注入过滤器链,然后使用构建器模式添加它。

这篇博文详细描述了如何设置它以及使用 Spring Security 的不同测试选项。 http://spring.io/blog/2014/05/23/preview-spring-security-test-web-security

对于您的具体示例,您可以这样做:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = {ApplicationConfiguration.class, FakeInMemoryMongoConfiguration.class, WebConfiguration.class})
@ActiveProfiles("test")
public class CarPartControllerIntegrationTest {
    @Autowired
    private WebApplicationContext wac;

    @Autowired
    private Filter springSecurityFilterChain;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
          mockMvc = MockMvcBuilders
                  .webAppContextSetup(wac)
                  .addFilters(springSecurityFilterChain)
                  .build();
    }
}
Run Code Online (Sandbox Code Playgroud)