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

OSGi R7 测试类中如何实例化配置并传递给@Activate方法?

OSGi R7 单元测试构造配置实例方案

方案1:Mockito 快速Mock(最简便,项目引入Mockito即可用)

直接Mock SampleConfig 接口,自定义需要返回的配置值:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.mockito.Mockito.when;

@ExtendWith(MockitoExtension.class)
public class TestSample {
    @Mock
    private SampleConfig sampleConfig;

    @Test
    public void testActivate() {
        // 自定义配置返回值
        when(sampleConfig.username()).thenReturn("test_user");
        // 实例化业务组件并调用激活方法
        Sample sample = new Sample();
        sample.activate(sampleConfig);
        // 此处追加后续业务逻辑验证代码
    }
}

方案2:手动实现配置接口(无第三方依赖)

SampleConfig 是注解接口,实现时需要额外实现annotationType方法:

import org.junit.jupiter.api.Test;
import java.lang.annotation.Annotation;

public class TestSample {
    @Test
    public void testActivate() {
        // 手动实现配置接口
        SampleConfig testConfig = new SampleConfig() {
            @Override
            public String username() {
                return "test_manual_user";
            }

            @Override
            public Class<? extends Annotation> annotationType() {
                return SampleConfig.class;
            }
        };
        Sample sample = new Sample();
        sample.activate(testConfig);
        // 后续业务验证
    }
}

方案3:动态代理通用生成(适合配置项多的场景)

写通用代理方法,可根据传入的属性Map批量生成任意配置接口实例,无需逐个实现:

import org.junit.jupiter.api.Test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Proxy;
import java.util.Map;
import org.osgi.service.metatype.annotations.AttributeDefinition;

public class TestSample {
    // 通用配置生成工具方法
    @SuppressWarnings("unchecked")
    private <T extends Annotation> T createConfig(Class<T> configClazz, Map<String, Object> properties) {
        return (T) Proxy.newProxyInstance(
            configClazz.getClassLoader(),
            new Class[]{configClazz},
            (proxy, method, args) -> {
                if ("annotationType".equals(method.getName())) {
                    return configClazz;
                }
                String methodName = method.getName();
                // 优先取传入的自定义配置
                if (properties.containsKey(methodName)) {
                    return properties.get(methodName);
                }
                // 没有自定义配置则取默认值
                AttributeDefinition attr = method.getAnnotation(AttributeDefinition.class);
                if (attr != null && !attr.defaultValue().isEmpty()) {
                    return attr.defaultValue();
                }
                return method.getDefaultValue();
            }
        );
    }

    @Test
    public void testActivate() {
        SampleConfig config = createConfig(SampleConfig.class, Map.of("username", "test_proxy_user"));
        Sample sample = new Sample();
        sample.activate(config);
        // 后续业务验证
    }
}

注意:如果你的activate方法还依赖ComponentContext或其他OSGi服务,对应参数也按上述方式构造传入即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:24:03