是否可以为Spring安全截获的Url创建单元测试

时间:2013-01-25 11:59:26

标签: unit-testing spring-security java-ee-5

我们的应用程序使用Spring安全性过滤Urls,如下所示:

<intercept-url pattern="/resources/**" access="ROLE_ANONYMOUS,ROLE_USER"/>

我们想编写一个单元测试,它会获取Url的列表并检查每个方法(GET,POST,PUT ..)是否可以访问。

我正在考虑使用DelegatingFilterProxy,但不确定如何加载config/context中的web.xml

这是一种有效的方法还是可取的?

2 个答案:

答案 0 :(得分:0)

您可以通过@Autowire DelegatingFilterProxy为拦截URL创建测试,并使用MockHttpServletRequest,MockHttpServletResponse和MockFilterChain来验证结果。

如果您正在使用Spring MVC,您可以查看支持过滤器(包括Spring Security)的Spring Test MVC。你可以find a sample in the repository。请注意,Spring Test MVC包含在Spring 3.2+中(在弹簧测试模块中)。它也可作为Spring 3.1的外部模块。

答案 1 :(得分:0)

在我的测试中涉及intercept-url:

@ContextConfiguration({
        "classpath:spring/spring-app.xml",
         ...
})
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
public class ControllerTest {

    private static final CharacterEncodingFilter CHARACTER_ENCODING_FILTER = new CharacterEncodingFilter();

    static {
        CHARACTER_ENCODING_FILTER.setEncoding("UTF-8");
        CHARACTER_ENCODING_FILTER.setForceEncoding(true);
    }

    protected MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @PostConstruct
    private void postConstruct() {
        mockMvc = MockMvcBuilders
            .webAppContextSetup(webApplicationContext)
            .addFilter(CHARACTER_ENCODING_FILTER)
            .apply(springSecurity())
            .build();
    }

    @Test
    public void testUsers() throws Exception {
        mockMvc.perform(get("/users")
            .with(authentication(new UsernamePasswordAuthenticationToken("user", "password")))
            .andDo(print())
            .andExpect(status().isOk())
            .andExpect(view().name("users"))
            .andExpect(forwardedUrl("/WEB-INF/jsp/users.jsp"));
    }
    ...