I need to test my REST Controllers which they are secured using Spring Security. I'm using MockMvc as spring security reference suggests here
http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#test-mockmvc
Test:
@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"));
}
}
When i'm running the JUnit test, i'm getting this failure trace
java.lang.NullPointerException at org.springframework.security.web.FilterChainProxy.getFilters(FilterChainProxy.java:223)
Also if remove the bean inside applicationContext.xml:
<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"/>
Then i'm getting this failure trace:
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)
I have no idea why the FilterChainProxy is null. Inside my Web.xml i have declare the DelegatingFilterProxy with filter-name springSecurityFilterChain and my application works fine. Please help me! Thanks
In your case, when using .webAppContextSetup
you probably forgot to extend AbstractSecurityWebApplicationInitializer
to make security filters initialized.
With standalone setup one would need to add her security config to @ContextConfiguration and autowire this bean:
@Autowired
FilterChainProxy springSecurityFilterChain;
Then prepare MockMvc like this:
MockMvc mockMvc = MockMvcBuilders
.standaloneSetup(controller)
.apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
.build();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With