我有以下服务方法,我正在做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);
...
}
}
有什么建议吗?谢谢!
答案 0 :(得分:0)
听起来工厂的实例没有被注入您的测试代码中。
您可以使用反射将resourceResolverFactory
字段设置为某个值value
:
Field field = SUT.class.getDeclaredField("resourceResolverFactory");
field.setAccessible(true);
field.set(instanceOfSutClass, value);
答案 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>);