如何在Spring Boot测试中模拟会话结束/到期?

时间:2017-11-18 00:16:40

标签: spring session spring-boot spring-test mockmvc

我想在此处显示的示例中添加几个测试:

https://spring.io/guides/gs/securing-web/

能够在会话关闭或过期时验证用户是否无法再访问需要身份验证的资源。我想在我的测试中模拟以下两个条件:

a)用户自愿结束会话(例如关闭浏览器);

b)会话超时;

我不知道如何使用MockMvc重现这些条件。

我设法做了以下事情:

@Test
public void sessionIsInvalid() throws Exception {
    FormLoginRequestBuilder login = formLogin()
            .user("user")
            .password("password");

    mockMvc.perform(login)
            .andExpect(authenticated())
            .andDo(mvcResult -> {
                MockHttpSession session = (MockHttpSession)mvcResult.getRequest().getSession();
                session.invalidate();
                mockMvc.perform(get("/hello")
                        .session(session))
                        .andExpect(status().isFound());
            });
}

......这似乎有效,但我不完全确定invalidate在这种情况下做了什么,以及它是否符合上述条件a)。

为了模拟会话超时,我完成了:

@Test
public void sessionExpires() throws Exception {
    FormLoginRequestBuilder login = formLogin()
            .user("user")
            .password("password");

    mockMvc.perform(login)
            .andExpect(authenticated())
            .andDo(mvcResult -> {
                MockHttpSession session = (MockHttpSession)mvcResult.getRequest().getSession();
                session.setMaxInactiveInterval(1);
                Thread.sleep(3);
                mockMvc.perform(get("/hello")
                        .session(session))
                        .andExpect(status().isFound());
            });
}

...但没有工作。有人能帮助我理解我做错了吗?

1 个答案:

答案 0 :(得分:1)

session.setMaxInactiveInterval(1);  // in seconds

Thread.sleep(3);  // in milliseconds