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

Java中如何定义嵌套注解并实现测试初始化与字段访问?

嵌套注解定义与测试使用方案

1. 改造MockToken注解,添加嵌套Permission注解

直接在原MockToken内部定义嵌套的Permission注解,同时新增permissions数组属性来对应目标JSON格式的权限列表:

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MockToken {

    String user() default "user";

    String[] allowedConfigs() default {};

    // 嵌套注解:描述单条权限的结构
    @interface Permission {
        // 对应JSON里的resource_id
        String resourceId() default "";
        // 对应JSON里的resource_scopes
        String[] resourceScopes() default {};
        // 对应JSON里的exp
        long exp() default 0L;
    }

    // 权限数组,支持配置多条权限
    Permission[] permissions() default {};
}

2. 测试中配置示例权限

方式1:直接在注解内配置

适合单次使用的场景,直接在测试方法上编写权限细节:

@Test
@MockToken(
    user = "user1",
    allowedConfigs = {"testUser"},
    permissions = {
        @MockToken.Permission(
            resourceId = "xy",
            resourceScopes = {"download"},
            exp = 1522334692L
        )
    }
)
public void testWithPermission() {
    // 测试逻辑
}

方式2:定义可复用的权限常量

如果需要在多个测试中复用同一份权限配置,可以在测试类里定义静态常量(必须是static final,满足注解属性的编译时常量要求):

public class PermissionTest {
    // 定义复用的权限示例
    public static final MockToken.Permission examplePermission = 
        @MockToken.Permission(
            resourceId = "xy",
            resourceScopes = {"download"},
            exp = 1522334692L
        );

    @Test
    @MockToken(
        user = "user1",
        allowedConfigs = {"testUser"},
        permissions = {examplePermission}
    )
    public void testWithReusablePermission() {
        // 测试逻辑
    }
}

3. 访问注解中的权限字段

通过反射获取MockToken注解后,就能遍历权限数组并访问每个字段:

// 获取测试方法的反射实例
Method testMethod = PermissionTest.class.getMethod("testWithReusablePermission");
// 获取方法上的MockToken注解
MockToken mockToken = testMethod.getAnnotation(MockToken.class);

// 遍历权限数组,读取字段值
for (MockToken.Permission permission : mockToken.permissions()) {
    String resourceId = permission.resourceId();
    String[] scopes = permission.resourceScopes();
    long exp = permission.exp();
    
    // 这里可以把这些值转换成你需要的JSON格式,或者直接用于逻辑判断
}

如果只有单条权限,直接通过mockToken.permissions()[0].resourceId()即可访问目标字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:22:42