我正在遵循wcm.io提出的有关AEM Mocks正确用法的指南。具体来说,我对注销服务感兴趣。该文档提供了用于注册服务的有用代码,但没有提供用于注销的代码。 flavio.donze我已经看过这个类似的问题,但是在AEM上下文的情况下,给他的问题提供的解决方案不起作用。
首先,如果我尝试这样注册服务:
ServiceReference ref = aemcontext.bundleContext().getServiceReference(MyServiceClass.class.getName());
[在bundleContext
中注册,但未在aemcontext
中注册。 ref
对象确实已设置,但是aemcontext
从未真正拥有该服务,并且如果我尝试注册使用该服务的servlet,如下所示:
context.registerInjectActivateService(new MyServlet(), myParams);
此调用失败,因为MyServlet
引用了MyServiceClass
。起作用的是直接在aemcontext
上注册服务,例如:
aemcontext.registerService(MyServiceClass.class, new MyServiceClass());
但是,当我然后尝试像提供给flavio.donze的问题的解决方案中那样取消注册此服务时,这两种解决方案均无效。我没有收到错误,我想ServiceRegistration<MyServiceClass> reg
确实发生了某些事情,但是该服务从未从aemcontext
中注销。如果以后尝试使用上面的第二个命令重新注册,则会收到错误消息,指出:
Multiple matches found for unary reference 'myServiceClass' for class...
有人可以帮我吗?是否可以通过AEM Mocks快速注销服务?
谢谢!
根据您的评论,我更新了答案:
然后只需执行2种测试方法。在每种测试方法之前,上下文对象将重新初始化
您不需要模拟SlingSettingsService。此服务已经成为Sling Mocks的一部分-并且也支持更改运行方式。
这里是一个示例JUnit测试:
public class FakeTest {
@Rule
public final AemContext aemcontext = new AemContext();
@Test
public void testOnAuthor() {
aemcontext.runMode("author");
SlingSettingsService slingSettingsService = aemcontext.getService(SlingSettingsService.class);
assertTrue(slingSettingsService.getRunModes().contains("author"));
assertFalse(slingSettingsService.getRunModes().contains("publish"));
}
@Test
public void testOnPublish() {
aemcontext.runMode("publish");
SlingSettingsService slingSettingsService = aemcontext.getService(SlingSettingsService.class);
assertFalse(slingSettingsService.getRunModes().contains("author"));
assertTrue(slingSettingsService.getRunModes().contains("publish"));
}
@Test
public void testTheImpossibleServerJump() {
SlingSettingsService slingSettingsService = aemcontext.getService(SlingSettingsService.class);
aemcontext.runMode("author");
assertTrue(slingSettingsService.getRunModes().contains("author"));
assertFalse(slingSettingsService.getRunModes().contains("publish"));
aemcontext.runMode("publish");
assertFalse(slingSettingsService.getRunModes().contains("author"));
assertTrue(slingSettingsService.getRunModes().contains("publish"));
aemcontext.runMode("author", "publish");
assertTrue(slingSettingsService.getRunModes().contains("author"));
assertTrue(slingSettingsService.getRunModes().contains("publish"));
}
}
旧答案] >>
您应该不要注销
OSGi-Mocks(吊带,AEM-Mocks)中的服务。你为什么仍然需要这个?单元测试应该测试您的功能代码-但OSGi接线不起作用。只是接受您无法验证单元测试中的所有内容,即使是诸如非启动包之类的简单内容也是如此。因此,您需要进行健康检查。如果您真的很需要这个!您可以扩展测试框架。它是open source
或者查看基于Pax Exam
最后看看服务器端JUnit测试
https://sling.apache.org/documentation/tutorials-how-tos/testing-sling-based-applications.html