我在 Spring Boot 集成测试中使用 Awaitility 时遇到问题。我的设置包括在执行我想要使用 Awaitility 验证的一段代码之前在测试中设置身份验证上下文。但是,由于 Awaitility 在不同的线程上运行谓词,因此它无法访问我设置的身份验证上下文,导致我的测试失败。
这是我的代码的简化版本:
@Test
public void testMyServiceWithAuthentication() {
// Logging in user
myService.performAction();
// Use Awaitility to wait for a condition
await().atMost(10, SECONDS).until(() -> {
// This predicate runs in a different thread, so it cannot access the authentication context
return myService.checkCondition();
});
}
当 Awaitility 谓词运行时,它无权访问主测试线程中设置的身份验证上下文,因此 myService.checkCondition() 由于缺少身份验证而失败。
我的问题: 有没有办法确保在 Spring Boot 集成测试中运行时身份验证上下文可用于 Awaitility 谓词?或者是否有另一种方法来等待依赖于同一线程内身份验证的条件?
Awaitility 通过 ConditionFactory#pollInSameThread
支持该用例指示 Awaitility 执行与测试相同的条件轮询。这是一项高级功能,在将其与永远等待(或长时间)的条件结合使用时应小心,因为当 Awaitility 使用与测试相同的线程时,它无法中断线程。为了安全起见,您应该始终将使用此功能的测试与测试框架特定的超时结合起来
对于您的示例代码,它的工作原理应该与此类似:
await().pollInSameThread().atMost(10, SECONDS).until(myService::checkCondition);