Osgi 在wcm.io';s AEM模拟
我遵循wcm.io提供的关于正确使用的指南。具体来说,我对注销服务感兴趣。文档提供了用于注册服务的有用代码,但不提供用于取消注册的代码。我已经研究过这个类似的问题,但是给出的解决方案在AEM环境下不起作用 首先,如果我试图注册这样的服务:Osgi 在wcm.io';s AEM模拟,osgi,aem,sling,Osgi,Aem,Sling,我遵循wcm.io提供的关于正确使用的指南。具体来说,我对注销服务感兴趣。文档提供了用于注册服务的有用代码,但不提供用于取消注册的代码。我已经研究过这个类似的问题,但是给出的解决方案在AEM环境下不起作用 首先,如果我试图注册这样的服务: ServiceReference ref = aemcontext.bundleContext().getServiceReference(MyServiceClass.class.getName()); context.registerInjectActi
ServiceReference ref = aemcontext.bundleContext().getServiceReference(MyServiceClass.class.getName());
context.registerInjectActivateService(new MyServlet(), myParams);
它在bundleContext
中注册,但不在aemcontext
中注册。确实设置了ref
对象,但是aemcontext
从未真正拥有该服务,如果我试图注册一个使用该服务的servlet:
ServiceReference ref = aemcontext.bundleContext().getServiceReference(MyServiceClass.class.getName());
context.registerInjectActivateService(new MyServlet(), myParams);
此调用失败,因为MyServlet
引用了MyServiceClass
。工作原理是直接在aemcontext
上注册服务,例如:
aemcontext.registerService(MyServiceClass.class, new MyServiceClass());
但是,当我尝试取消注册此服务时(如向的问题提供的解决方案中所述),两种解决方案都不起作用。我没有收到任何错误,我假设ServiceRegistration reg
确实发生了一些问题,但该服务从未从aemcontext
中注销。如果之后我尝试使用上面的第二个命令再次注册它,则会出现一个错误,表明:
Multiple matches found for unary reference 'myServiceClass' for class...
有人能帮我吗?有没有一种通过AEM mock快速注销服务的方法
谢谢 根据你的评论,我更新了答案:
registerService
注册所有模拟服务(例如,使用Mockito创建)。然后对所有应该成为JUnit测试一部分的服务使用registerInjectActivateService
。因为对于registerInjectActivateService
,所有引用的服务必须在注册之前注册@Component(service = FakeService.class)
public class FakeService {
@Reference
private SlingSettingsService slingSettingsService;
public boolean isAuthor() {
return slingSettingsService.getRunModes().contains("author");
}
public boolean isPublish() {
return slingSettingsService.getRunModes().contains("publish");
}
}
以下是此服务的JUnit测试:
public class FakeTest {
@Rule
public final AemContext aemcontext = new AemContext();
private FakeService fakeService;
@Before
public void setup() {
fakeService = aemcontext.registerInjectActivateService(new FakeService());
}
@Test
public void testOnAuthor() {
aemcontext.runMode("author");
assertTrue(fakeService.isAuthor());
assertFalse(fakeService.isPublish());
}
@Test
public void testOnPublish() {
aemcontext.runMode("publish");
assertFalse(fakeService.isAuthor());
assertTrue(fakeService.isPublish());
}
}
旧答案
根据你的评论,我更新了答案:
registerService
注册所有模拟服务(例如,使用Mockito创建)。然后对所有应该成为JUnit测试一部分的服务使用registerInjectActivateService
。因为对于registerInjectActivateService
,所有引用的服务必须在注册之前注册@Component(service = FakeService.class)
public class FakeService {
@Reference
private SlingSettingsService slingSettingsService;
public boolean isAuthor() {
return slingSettingsService.getRunModes().contains("author");
}
public boolean isPublish() {
return slingSettingsService.getRunModes().contains("publish");
}
}
以下是此服务的JUnit测试:
public class FakeTest {
@Rule
public final AemContext aemcontext = new AemContext();
private FakeService fakeService;
@Before
public void setup() {
fakeService = aemcontext.registerInjectActivateService(new FakeService());
}
@Test
public void testOnAuthor() {
aemcontext.runMode("author");
assertTrue(fakeService.isAuthor());
assertFalse(fakeService.isPublish());
}
@Test
public void testOnPublish() {
aemcontext.runMode("publish");
assertFalse(fakeService.isAuthor());
assertTrue(fakeService.isPublish());
}
}
旧答案