首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wcm.io:注册(模拟)ResourceResolverFactory问题

wcm.io:注册(模拟)ResourceResolverFactory问题
EN

Stack Overflow用户
提问于 2018-02-07 11:32:02
回答 1查看 2.3K关注 0票数 2

我正在使用wcm.io创建一个AEMContext,并且我能够创建一个简单的Sling模型,它没有引用其他服务。我确实想对我的AliasService添加一个引用,所以我在上下文设置中注册/激活它:

代码语言:javascript
复制
aemContext.registerInjectActivateService(new AliasService());

AliasService:

代码语言:javascript
复制
public class AliasService {

@Reference
private AutoClosableResourceResolverFactory resourceResolverFactory;

...

如您所见,此服务具有对AutoClosableResourceResolverFactory的引用,因此我注册/激活也是:

代码语言:javascript
复制
aemContext.registerInjectActivateService(AutoClosableResourceResolverFactory.class, new AutoClosableResourceResolverFactory());

AutoClosableResourceResolverFactory:

代码语言:javascript
复制
public class AutoClosableResourceResolverFactory {

@Reference
private ResourceResolverFactory delegate;

...

服务依赖于ResourceResolverFactory,因此我使用'MockResourceResolverFactory‘(注入的最终列表)注入/激活它:

代码语言:javascript
复制
aemContext.registerInjectActivateService(ResourceResolverFactory.class, new MockResourceResolverFactory());
aemContext.registerInjectActivateService(AutoClosableResourceResolverFactory.class, new AutoClosableResourceResolverFactory());
aemContext.registerInjectActivateService(new AliasService());

如果我尝试执行我的测试,我现在得到以下错误:

代码语言:javascript
复制
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),)时,我会得到一个错误。

服务:

代码语言:javascript
复制
...
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";
   }
}

吊索模型:

代码语言:javascript
复制
@OSGiService
private TestService testService;

public String getValue(){
   return testService.getValue();
}

登记册:

代码语言:javascript
复制
TestService testService = aemContext.registerInjectActivateService(new TestServiceImpl());

错误:

原因: org.apache.sling.testing.mock.osgi.NoScrMetadataException:没有为com.asadventure.core.service.TestServiceImpl类找到OSGi SCR元数据

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 14:22:09

您不需要费心于ResourceResolverFactory。它已经在AemContext中注册了。

这应该是解决您的问题的方法:

代码语言:javascript
复制
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注释的“设置”方法。这样你就不必每次考试都这么做了。或者,您可以构建自己的上下文(我怀疑您已经在根据图像中的堆栈跟踪进行判断),并在那里注册服务。

此外,您的代码似乎有一个错误:

代码语言:javascript
复制
registerInjectActivateService(ResourceResolverFactory.class, new MockResourceResolverFactory());

据我所知,没有任何方法签名将Clazz作为第一个参数,而将service instance作为第二个参数。

请参阅:http://wcm.io/testing/aem-mock/apidocs/org/apache/sling/testing/mock/osgi/context/OsgiContextImpl.html

它是下列之一:

代码语言:javascript
复制
registerInjectActivateService(T service)
registerInjectActivateService(T service, Map<String,Object> properties)
registerInjectActivateService(T service, Object... properties)

其中T service是实际的服务实例,(可选的)第二个参数用于配置。此配置将在服务的activate方法中传递。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48662756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档