You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对QuarkusTest与@TestSecurity实现参数化测试?

解决Quarkus参数化测试中动态设置用户角色的问题

问题原因

你尝试的写法无效是因为@TestSecurity是编译期注解,运行时动态创建注解实例不会被Quarkus测试框架识别,无法生效。必须用编程式方式替代注解,实现动态设置测试身份。

可行方案:使用SecurityTestUtils编程式设置身份

Quarkus提供了SecurityTestUtils工具类,支持在测试方法内部动态构造并设置认证信息,完美适配参数化测试场景。

完整实现代码

@QuarkusTest
class MyTest {

    @Inject
    Testservice testee;

    static Stream<TestUser> testUserDataProvider() {
        return Stream.of(
                new TestUser("a", "a"),
                new TestUser("b", "b")
        );
    }

    @ParameterizedTest
    @MethodSource("testUserDataProvider")
    void testWithRole_throwsException(TestUser testUser) {
        // 构造并设置测试身份,替代@TestSecurity注解的作用
        SecurityIdentity identity = SecurityTestUtils.createSecurityIdentityBuilder()
                .setPrincipal(() -> testUser.username())
                .addRole(testUser.role())
                .build();
        SecurityTestUtils.setSecurityIdentity(identity);

        assertThrows(ForbiddenException.class, () -> testee.myMethod());
    }

    private record TestUser(String username, String role) {}
}

依赖检查

确保项目已引入quarkus-test-security测试依赖:

  • Maven(pom.xml):
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-test-security</artifactId>
    <scope>test</scope>
</dependency>
  • Gradle(build.gradle):
testImplementation 'io.quarkus:quarkus-test-security'

说明

  • SecurityTestUtils.createSecurityIdentityBuilder()提供链式API,可灵活设置用户名、角色、权限等认证信息
  • 这种方式完全兼容JUnit 5的参数化测试,能批量复用测试逻辑,消除代码重复

内容的提问来源于stack exchange,提问作者c0r3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:20:10