【问题标题】:Get reference to (Mock)ResourceResolverFactory获取对 (Mock)ResourceResolverFactory 的引用
【发布时间】:2016-07-05 09:43:41
【问题描述】:

我有一个 Sling 模型类,其中包含对我的服务的引用:

@OSGiService
PlanService planService;

此服务引用了 ResourceResolverFactory,以获取具有“管理员用户”的 ResourceResolver:

@Reference
private ResourceResolverFactory resolverFactory;

我正在编写一个单元测试来测试我的模型类上的 adaptTo。我正在尝试像这样注入对 PlanService 的引用:

@Rule
public final OsgiContext osgiContext = new OsgiContext();

osgiContext.registerInjectActivateService(new PlanServiceImpl());

但我不知道如何注入对 ResourceResolverFactory 的引用。

我试过这样:

osgiContext.registerInjectActivateService(new MockResourceResolverFactory());

但我得到这个错误:

org.apache.sling.testing.mock.osgi.NoScrMetadataException: No OSGi SCR metadata found in classpath at OSGI-INF/org.apache.sling.testing.resourceresolver.MockResourceResolverFactory.xml

我在文档和所有可用的模拟选项中找不到如何注入此服务并自动获取参考。任何帮助都会非常有帮助,谢谢!

编辑: 感谢 Jérémie 的回答,ResourceResolverFactory 被注入到 PlanService 中。但是,我现在面临这个问题:

[main] WARN org.apache.sling.models.impl.ModelAdapterFactory - Required properties [c.r.o.c.s.j.PlanService c.r.o.c.m.Plan.planService] on model class class c.r.o.c.m.Plan were not able to be injected.

我尝试使用与 ResourceResolverFactory 相同的行:

osgiContext.registerService(PlanService.class, new PlanServiceImpl());

还要添加

MockModelAdapterFactory mockModelAdapterFactory = new MockModelAdapterFactory();
     mockModelAdapterFactory.addModelsForPackage("c.r.o.c.m");

osgiContext.registerService(ModelAdapterFactory.class, mockModelAdapterFactory);

但还是一样的问题……

编辑 2:用 SlingContext 而不是 OsgiContext 注册它解决了这个问题:

@Rule
public final SlingContext slingContext = new SlingContext(ResourceResolverType.RESOURCERESOLVER_MOCK);

@Mock
PlanService planServiceMock;

slingContext.registerService(PlanService.class, planServiceMock);

【问题讨论】:

  • 上述解决方案在我的情况下不起作用,我收到 java.lang.reflect.InvocationTargetException

标签: osgi sling sling-models


【解决方案1】:

我遇到了同样的问题,而不是我使用https://sling.apache.org/documentation/development/osgi-mock.html 上的指南,并按以下方式制作。现在它对我有用:

    BundleContext bundleContext = MockOsgi.newBundleContext();
    //register the service
    bundleContext.registerService(OtherService.class.getName(), new OtherService(), null);
    // get service instance
    ServiceReference ref = bundleContext.getServiceReference(OtherService.class.getName());
    OtherService service = (OtherService)bundleContext.getService(ref);

【讨论】:

    【解决方案2】:

    在测试之前尝试清理和构建您的项目。

    例如,

    gradlew clean build test
    

    【讨论】:

      【解决方案3】:

      试试这个:

      osgiContext.registerService(ResourceResolverFactory.class, new MockResourceResolverFactory());
      

      OsgiContext 的 Javadoc 是 here

      【讨论】:

      • 谢谢,它成功了。我编辑了我的问题,因为没有注入第二个参考(在模型中)。如果有任何机会你会对我做错的事情有任何提示。但无论如何,我会把你的帖子标记为答案。
      猜你喜欢
      • 1970-01-01
      • 2015-08-24
      • 2021-07-03
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多