注销wcm.io的AEM虚拟机中的服务

问题描述 投票:0回答:1

我正在遵循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快速注销服务?

谢谢!

osgi aem sling
1个回答
1
投票

根据您的评论,我更新了答案:

  1. 然后只需执行2种测试方法。在每种测试方法之前,上下文对象将重新初始化

  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"));
    }
}

旧答案] >>

  1. 您应该不要注销

    OSGi-Mocks(吊带,AEM-Mocks)中的服务。你为什么仍然需要这个?单元测试应该测试您的功能代码-但OSGi接线不起作用。只是接受您无法验证单元测试中的所有内容,即使是诸如非启动包之类的简单内容也是如此。因此,您需要进行健康检查。
  2. 如果您真的很需要这个!您可以扩展测试框架。它是open source

  3. 。也许其他人也可以使用它。
  4. 或者查看基于Pax Exam

  5. 的单元测试。在我看来,对于“常规” AEM项目而言,它有点过大。但是它提供了一个真正的OSGi容器。最大的优点是,它仍然可以作为您的Maven构建的正常部分运行。在AEM项目中,我看到了对技术感兴趣的人经常进行的此类测试。但是实际上,这些测试仅证明您可以在单元测试中使用真正的OSGi容器。普通的开发人员不会进行此类测试,因为对他们来说感觉太复杂了。
  6. 最后看看服务器端JUnit测试

  7. 。问题是,在构建过程中需要AEM实例和托管测试数据。同样,诸如代码覆盖率之类的指标也难以衡量。但是,无论如何,如果您的测试严重依赖AEM功能,我还是会建议这样做。用50行模拟LiveRelationshipManager进行的测试通常一文不值。然后最好使用真实的AEM在服务器端运行它们。另外,AEM项目原型已经提供了集成测试(=服务器端JUnit测试)。但是,即使在那儿,您也必须启动/停止服务以测试什么?

    https://sling.apache.org/documentation/tutorials-how-tos/testing-sling-based-applications.html

https://github.com/adobe/aem-project-archetype

© www.soinside.com 2019 - 2024. All rights reserved.