如何在Spring引导中使用Awaitility测试安全端点



我使用的是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。

我该如何解决这个问题?

MockMvc的安全性是由TestSecurityContextHolderPostProcessor实现的,它使用TestSecurityContextHolder来设置/获取安全上下文。这只是SecurityContextHolder的包装。

因此,您可以在awaitility线程中使用TestSecurityContextHolder.setContext(),它应该可以工作。

最新更新