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
相关产品推荐
相关产品推荐

