获取对 (Mock)ResourceResolverFactory 的引用

Gui*_*eau 5 osgi sling sling-models

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

\n\n
@OSGiService\nPlanService planService;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
@Reference\nprivate ResourceResolverFactory resolverFactory;\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
@Rule\npublic final OsgiContext osgiContext = new OsgiContext();\n\nosgiContext.registerInjectActivateService(new PlanServiceImpl());\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

我已经尝试过这样的:

\n\n
osgiContext.registerInjectActivateService(new MockResourceResolverFactory());\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我收到这个错误:

\n\n
org.apache.sling.testing.mock.osgi.NoScrMetadataException: No OSGi SCR metadata found in classpath at OSGI-INF/org.apache.sling.testing.resourceresolver.MockResourceResolverFactory.xml\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

编辑:\n感谢 J\xc3\xa9r\xc3\xa9mie\ 的回答,ResourceResolverFactory 被注入到 PlanService 中。然而,我现在面临这个问题:

\n\n
[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.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
osgiContext.registerService(PlanService.class, new PlanServiceImpl());\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且还要添加

\n\n
MockModelAdapterFactory mockModelAdapterFactory = new MockModelAdapterFactory();\n     mockModelAdapterFactory.addModelsForPackage("c.r.o.c.m");\n\nosgiContext.registerService(ModelAdapterFactory.class, mockModelAdapterFactory);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这仍然是同样的问题......

\n\n

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

\n\n
@Rule\npublic final SlingContext slingContext = new SlingContext(ResourceResolverType.RESOURCERESOLVER_MOCK);\n\n@Mock\nPlanService planServiceMock;\n\nslingContext.registerService(PlanService.class, planServiceMock);\n
Run Code Online (Sandbox Code Playgroud)\n

Jér*_*e B 4

尝试这个:

osgiContext.registerService(ResourceResolverFactory.class, new MockResourceResolverFactory());
Run Code Online (Sandbox Code Playgroud)

JavadocOsgiContext这里