【发布时间】:2016-08-03 14:44:18
【问题描述】:
Spring Boot 1.4 添加了@WebMvcTest,它连接了测试我的应用程序的网络切片所需的部分。这太棒了,但是我还想确保我的自定义过滤器和安全代码已连接好,这样我就可以验证它是否也能正常工作。
使用@WebMvcTest时如何添加自定义过滤器?
【问题讨论】:
标签: java spring testing spring-boot
Spring Boot 1.4 添加了@WebMvcTest,它连接了测试我的应用程序的网络切片所需的部分。这太棒了,但是我还想确保我的自定义过滤器和安全代码已连接好,这样我就可以验证它是否也能正常工作。
使用@WebMvcTest时如何添加自定义过滤器?
【问题讨论】:
标签: java spring testing spring-boot
@AutoConfigureWebMvc 当前导入以下自动配置类(参见spring-boot-test-autoconfigure jar 中的spring.factories):
# AutoConfigureMockMvc auto-configuration imports
org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc=\
org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration,\
org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityAutoConfiguration,\
org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration,\
org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration
在此列表之外MockMvcSecurityAutoConfiguration 将自动提供与安全过滤器的集成。
如果您需要添加对其他过滤器的支持,您可以编写自己的 MockMvcBuilderCustomizer(请参阅 MockMvcSecurityConfiguration.SecurityMockMvcBuilderCustomizer 以获得灵感)。
您可以使用嵌套的@TestConfiguration 类将您的定制器挂钩到特定测试中,您可以添加自己的spring.factories 并使用AutoConfigureMockMvc 键将其自动添加到所有测试中。
【讨论】:
除了@Phil Webb 指出的 Spring Boot 选项之外,您还可以使用普通的 Spting Framework 功能并执行以下操作:
@Autowired
private WebApplicationContext context;
@Autowired
private FilterChainProxy springSecurityFilter;
@Before
public void setup() {
mockMvc = MockMvcBuilders
.webAppContextSetup(context)
.addFilters(springSecurityFilter)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
}
【讨论】:
当@WebMvcTest 与 Spring Security 和自定义过滤器一起使用时,它将自动配置到 MockMvc 实例中。你可以在rwinch/spring-boot-sample/tree/so-38746850-webmvctest-customfilters 看到这个工作。具体来说,DemoApplicationTests 表明 Spring Security 已正确设置并且自定义过滤器已设置。
Spring Boot 会自动添加所有使用 SpringBootMockMvcBuilderCustomizer.addFilters 设置的 Filter。
MockMvcSecurityConfiguration 用于设置 Spring Security 的测试支持(即允许通过将 Spring Security 的 SecurityMockMvcRequestPostProcessors.testSecurityContext() 添加到 MockMvc 实例来使用 @MockUser。
【讨论】: