1

我正在使用 spring boot,我想通过使用MockMvc调用安全端点来断言异步副作用。

我一直在使用Awaitility,但显然在不同线程中执行时模拟的安全上下文会丢失。

我找不到传递上下文的方法,我尝试过SecurityContextHolder.setContext()但没有用,我猜 Spring 的 MockMvc 以不同的方式存储上下文。

  @Test
  @WithMockUser(authorities = "admin", username = "user")
  void shouldRunSideEffectAsync() throws Exception {
    mockMvc.perform(post("/foo")).andExpect(status().isAccepted());
    await()
        .atMost(TIMEOUT)
        .untilAsserted(() -> mockMvc.perform(get("/foo")).andExpect(status().isOk()));
  }

GET 将返回 404 一段时间,然后在异步任务完成时返回 200。但是,由于MockUser信息丢失,这将始终返回 403 。

我该如何解决这个问题?

4

1 回答 1

1

你几乎明白了。MockMvc 的安全性由TestSecurityContextHolderPostProcessor实现,它使用TestSecurityContextHolder来设置/获取安全上下文。这只是SecurityContextHolder.

所以你可以TestSecurityContextHolder.setContext()在等待线程中使用它应该可以工作。

于 2021-05-04T12:29:55.930 回答