MockMvc和Spring Security - Null FilterChainProxy

时间:2015-12-08 12:38:19

标签: java spring-mvc testing spring-security

我需要使用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 at   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   实现Filter存在或注入要使用的Filter。在   org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurer.beforeMockMvcCreated(SecurityMockMvcConfigurer.java:62)

我不知道为什么FilterChainProxy为null。在我的Web.xml中,我已经使用filter-name springSecurityFilterChain声明了DelegatingFilterProxy,我的应用程序运行正常。请帮我!感谢

2 个答案:

答案 0 :(得分:4)

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

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

 @Autowired
 FilterChainProxy springSecurityFilterChain;

然后像这样准备MockMvc:

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

答案 1 :(得分:-9)

我设法让它发挥作用。 只需确保您具有正确的上下文配置。您也不需要声明FilterChainProxy bean。 感谢