MockMvc 和 Spring Security - Null FilterChainProxy

Posted

技术标签:

【中文标题】MockMvc 和 Spring Security - Null FilterChainProxy【英文标题】:MockMvc and Spring Security - Null FilterChainProxy 【发布时间】:2016-03-13 09:17:46 【问题描述】:

我需要测试使用 Spring Security 保护的 REST 控制器。我在这里使用 MockMvc 作为春季安全参考建议

http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#test-mockmvc

测试:

@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class LikesTest 

    protected MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @Before
    public void setup() 
        mockMvc = MockMvcBuilders
                .webAppContextSetup(context)
                //.standaloneSetup(new MessageController())
                .apply(SecurityMockMvcConfigurers.springSecurity())
                .build();
    

    @Test
    @WithMockUser("user")
    public void testAddLike() throws Exception 
        mockMvc.perform(get("/like?msgId=4&like=false"));
    

当我运行 JUnit 测试时,我得到了这个失败跟踪

java.lang.NullPointerException 在 org.springframework.security.web.FilterChainProxy.getFilters(FilterChainProxy.java:223)

如果删除 applicationContext.xml 中的 bean:

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"/>

然后我得到这个失败跟踪:

java.lang.IllegalStateException: springSecurityFilterChain 不能 空值。确保一个名为 springSecurityFilterChain 的 Bean 实现过滤器存在或注入要使用的过滤器。在 org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurer.beforeMockMvcCreated(SecurityMockMvcConfigurer.java:62)

我不知道为什么 FilterChainProxy 为空。在我的 Web.xml 中,我已经使用过滤器名称 springSecurityFilterChain 声明了 DelegatingFilterProxy,并且我的应用程序工作正常。请帮我!谢谢

【问题讨论】:

【参考方案1】:

在您的情况下,当使用 .webAppContextSetup 时,您可能忘记扩展 AbstractSecurityWebApplicationInitializer 以初始化安全过滤器。

使用独立设置需要将她的安全配置添加到 @ContextConfiguration 并自动装配这个 bean:

 @Autowired
 FilterChainProxy springSecurityFilterChain;

然后像这样准备 MockMvc:

MockMvc mockMvc = MockMvcBuilders
   .standaloneSetup(controller)
   .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
   .build();

【讨论】:

FilterChainProxy 不是 bean,【参考方案2】:

我已经设法让它工作了。 只要确保你有正确的上下文配置。此外,您不需要声明 FilterChainProxy bean。 谢谢

【讨论】:

>>> 只要确保你有正确的上下文配置。如果人们知道他们的配置应该是什么样子,那么他们就不会来看这篇文章。 提供一些比“只要确保你有正确的上下文配置”更多的细节会不会很好,这是一个可以应用于可能所有与弹簧相关的问题的答案,而不给读者丝毫关于真正解决方案的线索...... 除非你把 context.xml 放在这里,否则你的答案是没有用的

以上是关于MockMvc 和 Spring Security - Null FilterChainProxy的主要内容,如果未能解决你的问题,请参考以下文章

使用 spring-data-jpa 和 MockMvc 进行 spring boot junit 测试

spring boot 测试无法注入 TestRestTemplate 和 MockMvc

Spring - 如何正确使用@Autowired 来防止控制器/ MockMvc 为空?

使用 MockMvc 和 AutoConfigureMockMvc 测试 Spring Boot Web 应用程序时出现 LazyInitializationException 的原因是啥

Spring MockMvc 和异步控制器的 HTTP 状态码

Spring 的 MockMvc 是用于单元测试还是集成测试?