Spring mvc SpringMVC与SpringSecurity的集成测试

Spring mvc SpringMVC与SpringSecurity的集成测试,spring-mvc,spring-security,spring-test-mvc,Spring Mvc,Spring Security,Spring Test Mvc,我正在尝试使用mvc测试来测试我的登录页面。 在我添加spring安全性之前,我工作得相当好 我的代码是: mockMvc.perform( post("j_spring_security_check") .param(LOGIN_FORM_USERNAME_FIELD, testUsernameValue) .param(LOGIN_FORM_PASSWORD_FIELD, testPasswordVa

我正在尝试使用mvc测试来测试我的登录页面。 在我添加spring安全性之前,我工作得相当好

我的代码是:

 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中):


springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
当我尝试在@ContextConfiguration中添加web.xml时失败,当我删除它时,我得到一个异常:

java.lang.AssertionError: Status expected:<200> but was:<405>
java.lang.AssertionError:应为状态:但为:
有没有办法通过在my security-context.xml中定义的配置将DelegatingProxyFilter添加到测试上下文以使其工作?我尝试了一些关于注入FilterProxyChain的教程,但在我的案例中不起作用

有人能帮我吗?
提前感谢更新:Spring Security 4+提供了开箱即用的功能。要使用它,请确保使用
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时失败了”是什么意思,但是,您可以使用SpringTestMVC来验证Spring安全性。有一个非常好的例子

基本大纲如下所示:

@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

添加到pom.xml中

<repository>
    <id>spring-snaspho</id>
    <url>http://repo.springsource.org/libs-milestone/</url>
</repository>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>4.0.0.M1</version>
</dependency>

斯纳斯波温泉酒店
http://repo.springsource.org/libs-milestone/
org.springframework.security

()

不要认为你可以用这种方式测试安全过滤器,因为它不是一个完整的http服务器,而是一种解决spring mvc测试提供的rls的方法。您可能只需要依靠单元测试来验证位中的各个部分。很棒的gihub链接!非常感谢。注意。用于弹簧安全性的弹簧启动机POM不包括弹簧安全性测试。我不得不将它添加到我的主POM中,以获取springSecurity()Boot使用spring security bom,其中包括4.1.0+中的spring security test@Rob我有spring Boot starter security、spring Boot starter test和spring security test(4.1.0.RELEASE)以及spring Boot 1.3.5。如果我删除了spring安全测试,那么它对我不起作用。对不起,我误解了。是的,您需要包括spring安全测试。但是,您不需要提供版本。
<repository>
    <id>spring-snaspho</id>
    <url>http://repo.springsource.org/libs-milestone/</url>
</repository>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-test</artifactId>
    <version>4.0.0.M1</version>
</dependency>