单元测试OSGi服务,它引用了另一个服务

时间:2016-05-09 00:19:10

标签: java junit osgi mockito

我有以下服务方法,我正在做Junit测试。 SUT类具有对ResourceResolverFactory服务的@Reference。当我启动SUT类时,resourceResolverFactory始终为null,这会导致在try块中执行第1行时抛出NullPointerException: resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);

@Reference
ResourceResolverFactory resourceResolverFactory;    

@Override
public PropertyStatusInfo getPropertyStatusInfo(String hotelCode,
        String brandCode) {
    LOGGER.info( "Class : " + this.getClass().getName() 
               + " : Method : getPropertyStatusInfo() : [ENTER]");
    LOGGER.debug( "Input Parameters : Hotel Code - "
                + hotelCode + " BrandCode - " + brandCode);
    ResourceResolver resourceResolver;
    Session session = null;    
    try {
        resourceResolver = resourceResolverFactory.
                           getAdministrativeResourceResolver(null);
        ...
    }
}

有什么建议吗?谢谢!

4 个答案:

答案 0 :(得分:0)

听起来工厂的实例没有被注入您的测试代码中。 您可以使用反射将resourceResolverFactory字段设置为某个值value

Field field = SUT.class.getDeclaredField("resourceResolverFactory");
field.setAccessible(true);
field.set(instanceOfSutClass, value);

来源:https://stackoverflow.com/a/19976626/3895897

答案 1 :(得分:0)

由于您的字段不是私密的,您可以从同一个包中访问它。因此,只需将您的单元测试放在与测试类相同的包中,您就可以:

sut = new SUT();    
sut.resourceResolverFactory = myFactory;
... = sut.getPropertyStatusInfo(...);

当然,您仍应确保您的测试与您的物理测试代码分开。

答案 2 :(得分:0)

您可以使用mockito或任何其他模拟库来创建模拟ResourceResolverFactory,并使用JUnit的@before将其注入到测试的bean中。

答案 3 :(得分:-1)

您也可以使用以下代码:

import junitx.util.PrivateAccessor;

PrivateAccessor.setField(<Source class>, <variable name>, <variable value>);