我需要测试我的 REST Controller ,它们使用 Spring Security 进行保护。我正在使用 MockMvc 作为 spring security reference suggests here
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 cannot be null. Ensure a Bean with the name springSecurityFilterChain implementing Filter is present or inject the Filter to be used. at org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurer.beforeMockMvcCreated(SecurityMockMvcConfigurer.java:62)
我不知道为什么 FilterChainProxy 为空。在我的 Web.xml 中,我声明了带有过滤器名称 springSecurityFilterChain 的 DelegatingFilterProxy,我的应用程序工作正常。请帮我!谢谢
最佳答案
在您的情况下,当使用 .webAppContextSetup
时,您可能忘记扩展 AbstractSecurityWebApplicationInitializer
以初始化安全过滤器。
对于独立设置,需要将她的安全配置添加到@ContextConfiguration 并 Autowiring 此 bean:
@Autowired
FilterChainProxy springSecurityFilterChain;
然后像这样准备MockMvc:
MockMvc mockMvc = MockMvcBuilders
.standaloneSetup(controller)
.apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
.build();
关于java - MockMvc 和 Spring Security - Null FilterChainProxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34156129/