【问题标题】:Mock private field being initialized by OSGI Felix container模拟由 OSGI Felix 容器初始化的私有字段
【发布时间】:2025-12-07 04:15:01
【问题描述】:

我正在尝试在我的类中模拟一个私有字段,该字段正在由运行我的应用程序的 OSGI 容器初始化。我放了一个示例代码供参考,请提供任何线索:

import org.apache.felix.scr.annotations.*
@Component (name = "MyServiceImpl ", ds = true, immediate = true)
@Service
public class MyServiceImpl extends MyBasee implements MyService {

    @Reference (name = "MyOtherService", bind = "bind", unbind = "unbind", policy = ReferencePolicy.STATIC)
    private MyOtherService myServiceRegistryConsumer;
}

这里我试图模拟私有字段MyOtherService myServiceRegistryConsumer

【问题讨论】:

    标签: java mockito apache-felix osgi-bundle


    【解决方案1】:

    借助 Mockito,您可以使用 @InjectMocksannotation 模拟和注入字段。

    @RunWith(MockitoJUnitRunner.class)
    public class AppTest {
    
        @Mock
        private MyOtherService myServiceRegistryConsumer;
    
        @InjectMocks
        private MyServiceImpl myServiceImpl;
    
        @Test
        public void testSomething() {
            // e.g. define behavior for the injected field
            when(myServiceRegistryConsumer.methodA()).thenReturn(/* mocked return value */);
        }
    } 
    

    【讨论】:

    • 为了更清楚,我编辑了我的问题。这样我就无法控制私有字段 myServiceRegistryConsumer。我不想注入/模拟 MyServiceImpl 而是 MyOtherService 对象,它正在由容器实例化。
    • @Arun myServiceImpl 不是这里的模拟。 Mockito 只模拟 myServiceRegistryConsumer 并将其注入到实例中。在测试方法中,您仍然可以完全控制模拟,并且可以为其定义行为。
    • 是的,完全按照您解释的方式工作。非常感谢:)