Java 单元测试AEM 6.1和模拟吊索、Jcr和Osgi

Java 单元测试AEM 6.1和模拟吊索、Jcr和Osgi,java,unit-testing,aem,Java,Unit Testing,Aem,背景 嗨 所以我最近在一家使用AEM 6.1的公司工作,我也是一名初级开发人员 当我与我的好友(高级开发人员)配对时,他通常会开车。但是不写单元测试,这让我很烦。他解释说,很难对AEM进行单元测试 我们的项目使用http sling请求和响应、Osgi框架和大型Jcr存储库、JSP、servlet和数据库连接。我们使用各种设计模式,创建适配器类。。。等等 问题 当存在针对sling、Osgi和Jcr的模拟框架时,为什么很难为AEM创建单元测试 如何学习单元测试AEM 6.1 前进… 我正在寻找能

背景

所以我最近在一家使用AEM 6.1的公司工作,我也是一名初级开发人员

当我与我的好友(高级开发人员)配对时,他通常会开车。但是不写单元测试,这让我很烦。他解释说,很难对AEM进行单元测试

我们的项目使用http sling请求和响应、Osgi框架和大型Jcr存储库、JSP、servlet和数据库连接。我们使用各种设计模式,创建适配器类。。。等等

问题

当存在针对sling、Osgi和Jcr的模拟框架时,为什么很难为AEM创建单元测试

如何学习单元测试AEM 6.1

前进…


我正在寻找能够为AEM创建单元测试的资源?如果可能的话,请在下面链接任何资源

这取决于代码,一个代码可以很容易地用测试覆盖,而另一个代码则不能。为这种“不可测试”的代码(在没有测试的情况下创建的代码)支持单元测试是一件非常痛苦的事情

在这里,您可以通过示例找到单元测试库


您还可以使用类似smth的工具测试代码(在许多情况下,使用Mockito创建模拟比在Sling mock库中创建更容易)。

当我第一次开始在AEM中开发时,我也有同样的感觉。随着时间的推移,我努力为我的公司改变这一点,现在我们有了一个单元测试AEM代码的环境

为什么AEM代码很难测试?我认为主要原因归结为两点:

  • 许多Adobe示例以JSP的形式提供,带有内联Java代码(Scriptlet)。Scriptlet代码不可测试,也不可重用。我认为,您在Adobe中看到这一点的一个原因是,该产品允许开发人员“覆盖”基本功能。内置代码在“libs”下运行,但开发人员可以复制libs中的代码并将其放置在“apps”中,然后对其进行更改,这些更改将取代现有代码生效。对于包含Scriptlet的JSP,很容易替换这样的代码,因为您可以将标记与Java代码一起获得,并且仍然可以对其进行更改。但是,如果Java代码在其他库中,您如何替换它呢?虽然这是可能的,但难度要大得多。因此,我认为Adobe有很多示例代码,可以在Scriptlet中显示Java代码。但这是一种糟糕的做法,不管其原因是什么。如果要进行单元测试,就不能这样做。所以不要允许它。要求开发人员将代码放入.java类中,并通过标记(或其他类似机制)将其包括在内。然后,您可以对代码进行单元测试,并更容易地重用它
  • 为AEM编写的大多数代码都需要与AEM使用的respository交互。因此,您不可避免地依赖于作为基本AEM安装一部分的代码/包。当您尝试编写自己的.java类时,您很快就会发现,除非IDE的类路径上有这些相同的依赖项,否则无法编译。对于旧的AEM版本,没有供应商提供的方法让我了解这些。但最近的版本有它——一个“Uber.jar”。我认为依赖性问题阻碍了开发人员。并且,他们将Java代码还原为JSP中的Scriptlet。如果您想对AEM代码进行单元测试,则必须提取AEM提供的代码的所有依赖项,并将其作为IDE中项目的一部分。这不是一项琐碎的工作,但它是能够像在其他Java项目中一样在IDE和持续集成构建项目中以正常方式高效开发和测试的先决条件
  • 我们通过制作一个“container.jar”来解决#2问题,它包含AEM实例中编译和单元测试Java代码所需的所有.jar文件。但是最近的AEM版本在Uber.jar中提供了这一点,这使得这项任务变得更加容易。我们还使用Mockito对Java代码进行单元测试。它允许对我们所依赖的Sling和AEM类进行简单而强大的模拟。我们一直在使用它。我们偶尔也会使用PowerMockito进行一些模拟

    除此之外,测试用于AEM的Java代码并不比测试任何其他Java代码更困难。我们还使用Karma和Jasmine添加了JavaScript单元测试支持——因此同样的事情也适用于客户端代码

    以下是一些可能有帮助的资源:


      • 一个主要问题是uber jar被混淆了,因此它只包含API接口和类。因此,您必须模拟AEM对象,这相当麻烦。但是,Adobe提供了一个未被混淆的uber jar

        为AEM编写测试应该不难,ApacheSling社区提供了不同级别的测试方法,因为AEM基于Sling,所以我们可以使用相同的工具

        签出以下链接:

        • 概述:
        • 单元测试:
        • HTTP测试:
        • 吊索模拟: