我需要使用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,我的应用程序运行正常。请帮我!感谢
答案 0 :(得分:4)
在您的情况下,使用.webAppContextSetup
时,您可能忘记扩展AbstractSecurityWebApplicationInitializer
以初始化安全过滤器。
使用独立设置,需要将她的安全配置添加到@ContextConfiguration并自动装配此bean:
@Autowired
FilterChainProxy springSecurityFilterChain;
然后像这样准备MockMvc:
MockMvc mockMvc = MockMvcBuilders
.standaloneSetup(controller)
.apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
.build();
答案 1 :(得分:-9)
我设法让它发挥作用。 只需确保您具有正确的上下文配置。您也不需要声明FilterChainProxy bean。 感谢