【问题标题】:How to test stateless with MockMvc and Mockito如何使用 MockMvc 和 Mockito 测试无状态
【发布时间】:2019-03-28 06:27:36
【问题描述】:

我最近继承了一些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());
        }
    }

【问题讨论】:

    标签: java mockito stateless mockmvc


    【解决方案1】:

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

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

    并在设置中使用它:

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

    删除所有注解@WithMockUser 最后,改变

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多