如何使用MockMvc和Mockito测试无状态

时间:2018-10-23 22:51:03

标签: java mockito stateless mockmvc

我最近继承了一些Java代码,需要在HttpSecurity配置中将其切换为无状态:

http.csrf().disable()
    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

此后,使用MockMvc的某些测试失败。我知道@WithMockUser将无法在无状态的情况下工作,那么我应该如何更改以使其通过? 这是一个示例测试:

    @Before
    public void setUp() throws Exception {

        this.mockMvc = MockMvcBuilders.standaloneSetup(apAdminController)
            .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
            .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver())
            .build();

        storeUser = new StoreUser();
        storeUser.setUsername("smith");
        storeUser.setEnabled(true);
    }

    @Test
    @WithMockUser(roles = "ADMIN")
    public void testViewStoreUserWithAdmin() {
        try {
            mockMvc.perform(
                get("{resource}/1", RESOURCE).with(testSecurityContext()))
                .andDo(print())
                .andExpect(status().isOk());

        } catch (Exception e) {
            fail("Test failed: " + e.getMessage());
        }
    }

1 个答案:

答案 0 :(得分:0)

我花了很长时间才能找到答案,这是我最终得到的结果,以防万一有人在挣扎:

将SessionCreationPolicy从“ If_REQUIRED”或“ ALWAYS”更改为“ STATELESS”后 在测试中: 替换导入.SecurityMockMvcRequestPostProcessors.testSecurityContext;来导入.SecurityMockMvcRequestPostProcessors.user;

并在设置中使用它:

this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
            .addFilters(springSecurityFilterChain)
            .build();

删除所有注释@WithMockUser 最后,更改

get("{resource}", RESOURCE).with(testSecurityContext()))

get("{resource}", RESOURCE).with(user("admin").roles("ADMIN")))