如何在 Spring Boot 集成测试中将 Awaitility 与身份验证上下文结合使用?

问题描述 投票:0回答:1

我在 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 谓词?或者是否有另一种方法来等待依赖于同一线程内身份验证的条件?

java spring spring-security automated-tests awaitility
1个回答
0
投票

Awaitility 通过 ConditionFactory#pollInSameThread

支持该用例

指示 Awaitility 执行与测试相同的条件轮询。这是一项高级功能,在将其与永远等待(或长时间)的条件结合使用时应小心,因为当 Awaitility 使用与测试相同的线程时,它无法中断线程。为了安全起见,您应该始终将使用此功能的测试与测试框架特定的超时结合起来

对于您的示例代码,它的工作原理应该与此类似:

    await().pollInSameThread().atMost(10, SECONDS).until(myService::checkCondition);
© www.soinside.com 2019 - 2024. All rights reserved.