spring-mvc – Spring Spring的MVC集成测试

我试图使用mvc-test测试我的登录页面。
在加入春季安全之前,我的工作相当不错。

我的代码是:

 mockMvc.perform(
     post("j_spring_security_check")
                    .param(LOGIN_FORM_USERNAME_FIELD, testUsernameValue)
                    .param(LOGIN_FORM_PASSWORD_FIELD, testPasswordValue))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(model().attribute(LOGIN_PAGE_STATUS_VALUE, LOGIN_PAGE_STATUS_FALSE_INDICATOR));

测试类添加了正确的注释:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })

我的过滤器被定义(在web.xml中):

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

当我尝试在@ContextConfiguration中添加web.xml时,它会失败,当我删除它时,我得到一个异常:

java.lang.AssertionError: Status expected:<200> but was:<405>

有没有办法添加DelegatingProxyFilter来测试上下文与我的security-context.xml中定义的配置使其工作?我尝试了几个教程,注入FilterProxyChain,但它不工作在我的情况。

有人可以帮助我吗?
提前致谢

最佳答案
更新:Spring Security 4提供了开箱即用的integration with MockMvc.为了使用它,请确保使用apply(springSecurity()),如下所示:

import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class MockMvcSecurityTests {

    @Autowired
    private WebApplicationContext context;

    private MockMvc mvc;

    @Before
    public void setup() {
        mvc = MockMvcBuilders
                .webAppContextSetup(context)
                .apply(springSecurity())
                .build();
    }
    ...
}

原始答案

我不知道你的意思是“当我尝试在@ContextConfiguration中添加web.xml失败”时,可以使用Spring Test MVC验证Spring Security。有一个非常好的example outlined in the spring-test-mvc project

基本概要如下所示:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:security-context.xml", "classpath:applicationContext.xml", "classpath:test-contexts/test-context.xml" })
public class MyTests {

    @Autowired
    private FilterChainProxy springSecurityFilterChain;

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
            .addFilters(this.springSecurityFilterChain).build();
    }
}

这个想法是您@Autowire FilterChainProxy(DelegatingProxyFilter委托给什么),并指示MockMvc使用FilterChainProxy。

注意spring-test-mvc集成到spring-test-3.2和Spring 3.1.x的一个单独的项目中,所以你可以相当可以使用这个例子(spring-test-mvc不支持@WebAppConfiguration,并且必须使用WebContextLoader代替)。

转载注明原文:spring-mvc – Spring Spring的MVC集成测试 - 代码日志