我正在使用wcm.io创建一个AEMContext,并且我能够创建一个简单的Sling模型,它没有引用其他服务。我确实想对我的AliasService添加一个引用,所以我在上下文设置中注册/激活它:
aemContext.registerInjectActivateService(new AliasService());AliasService:
public class AliasService {
@Reference
private AutoClosableResourceResolverFactory resourceResolverFactory;
...如您所见,此服务具有对AutoClosableResourceResolverFactory的引用,因此我注册/激活也是:
aemContext.registerInjectActivateService(AutoClosableResourceResolverFactory.class, new AutoClosableResourceResolverFactory());AutoClosableResourceResolverFactory:
public class AutoClosableResourceResolverFactory {
@Reference
private ResourceResolverFactory delegate;
...服务依赖于ResourceResolverFactory,因此我使用'MockResourceResolverFactory‘(注入的最终列表)注入/激活它:
aemContext.registerInjectActivateService(ResourceResolverFactory.class, new MockResourceResolverFactory());
aemContext.registerInjectActivateService(AutoClosableResourceResolverFactory.class, new AutoClosableResourceResolverFactory());
aemContext.registerInjectActivateService(new AliasService());如果我尝试执行我的测试,我现在得到以下错误:
Caused by: java.lang.IllegalArgumentException: args must be an even number of name/values:[org.apache.sling.testing.resourceresolver.MockResourceResolverFactory@7fb95505]

我不知道如何解决这个问题,也不知道是什么原因造成的,所有的帮助都是非常感谢的!
更新
fix Jens为我的旧服务(基于Felix注释的-> org.apache.felix.scr.annotations.Component)提供了完全有效的服务。当我尝试一个较新的服务(基于OSGI注释的org.osgi.service.component.annotations.Component),)时,我会得到一个错误。
服务:
...
import org.osgi.service.component.annotations.Component;
@Component(service = TestService.class, immediate = true, property = {
Constants.SERVICE_DESCRIPTION + "=" + "Test Service",
Constants.SERVICE_VENDOR + "=" + BundleConstants.SERVICE_VENDOR
})
public class TestServiceImpl implements TestService {
@Override
public String getValue() {
return "test-value-from-service";
}
}吊索模型:
@OSGiService
private TestService testService;
public String getValue(){
return testService.getValue();
}登记册:
TestService testService = aemContext.registerInjectActivateService(new TestServiceImpl());错误:
原因: org.apache.sling.testing.mock.osgi.NoScrMetadataException:没有为com.asadventure.core.service.TestServiceImpl类找到OSGi SCR元数据

我遗漏了什么?
发布于 2018-02-07 14:22:09
您不需要费心于ResourceResolverFactory。它已经在AemContext中注册了。
这应该是解决您的问题的方法:
public class AliasServiceTest {
@Rule
public final AemContext aemContext = new AemContext();
@Test
public void testAliasService() {
// This will register your Resource Resolver Factory. This should work
// because the referenced (Sling) Resource Resolver Factory is already
// registered in the "aemContext". Therefore, all references are satisfied
// and the service should be activated.
aemContext.registerInjectActivateService(new AutoClosableResourceResolverFactory());
AliasService service = aemContext.registerInjectActivateService(new AliasService());
service.callSomeMethod();
}
}您可以将AutoClosableResourceResolverFactory的注册移动到由@Before注释的“设置”方法。这样你就不必每次考试都这么做了。或者,您可以构建自己的上下文(我怀疑您已经在根据图像中的堆栈跟踪进行判断),并在那里注册服务。
此外,您的代码似乎有一个错误:
registerInjectActivateService(ResourceResolverFactory.class, new MockResourceResolverFactory());据我所知,没有任何方法签名将Clazz作为第一个参数,而将service instance作为第二个参数。
请参阅:http://wcm.io/testing/aem-mock/apidocs/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.html
它是下列之一:
registerInjectActivateService(T service)
registerInjectActivateService(T service, Map<String,Object> properties)
registerInjectActivateService(T service, Object... properties)其中T service是实际的服务实例,(可选的)第二个参数用于配置。此配置将在服务的activate方法中传递。
https://stackoverflow.com/questions/48662756
复制相似问题