【问题标题】:Unit testing AEM 6.1 and mocking sling, Jcr and Osgi单元测试 AEM 6.1 和 mocking sling、Jcr 和 Osgi
【发布时间】:2016-10-03 18:42:59
【问题描述】:

背景

你好,

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

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

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

问题

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

如何学习对 AEM 6.1 进行单元测试?

继续前进...

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

【问题讨论】:

    标签: java unit-testing aem


    【解决方案1】:

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

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

    1. 许多 Adob​​e 示例以带有内联 Java 代码(scriptlet)的 JSP 的形式出现。 Scriptlet 代码不可测试,也不可重用。我认为您从 Adob​​e 看到如此多的原因之一是该产品允许开发人员“叠加”基本功能。内置代码在“libs”下运行,但开发人员可以复制 libs 中的代码并将其放置在“apps”中,然后对其进行更改——这些更改将在现有代码的位置生效。使用包含 scriptlet 的 JSP,很容易替换像这样的代码,因为您可以获得与 Java 代码一起的标记并且仍然可以更改它。但是如果那个 Java 代码在其他库中,你怎么能替换它呢?虽然有可能,但难度会大得多。所以我认为 Adob​​e 有很多在 scriptlet 中显示 Java 代码的示例代码。但这是不好的做法,不管它的原因是什么。如果要进行单元测试,则不能这样做。所以不允许。要求开发人员将代码放入 .java 类中并通过标签(或其他类似机制)包含它。然后,您可以对代码进行单元测试——并且更轻松地重用它。
    2. 您为 AEM 编写的大多数代码都需要与 AEM 使用的存储库进行交互。因此,您不可避免地依赖于作为基本 AEM 安装一部分的代码/包。当您尝试编写自己的 .java 类时,您很快就会发现,除非您在 IDE 的类路径上具有这些相同的依赖项,否则将无法编译。对于较旧的 AEM 版本,没有供应商提供的方法让我知道这些。但最近的版本有它——一个“Uber”.jar。我认为依赖性问题会阻止开发人员。他们在 Java 代码中恢复为 JSP 中的 scriptlet。如果要对 AEM 代码进行单元测试,则必须提取对 AEM 提供的代码的所有依赖项,并使其成为 IDE 中项目的一部分。这不是一项简单的工作,但它是能够像在其他 Java 项目中一样在 IDE 和持续集成构建项目中高效开发和测试的先决条件。

    我们通过制作一个“容器”.jar 解决了 #2,其中包含来自 AEM 实例的所有 .jar 文件,我们需要这些文件来编译和单元测试 Java 代码。但是最近的 AEM 版本在 Uber .jar 中提供了这个,这使得这项任务变得更加容易。我们还使用 Mockito 对 Java 代码进行单元测试。它允许对我们所依赖的 Sling 和 AEM 类进行简单而强大的模拟。我们一直在使用它。我们偶尔也会使用 PowerMockito 进行一些模拟。

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

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

    【讨论】:

      【解决方案2】:

      这取决于代码,一个代码你可以很容易地用测试覆盖,而其他代码不能。为这种“不可测试”的代码(创建时没有考虑测试的代码)支持单元测试是一件很痛苦的事情。

      在这里,您可以找到带有示例的单元测试库link

      您还可以使用 Mockito 之类的东西来测试您的代码(在许多情况下,使用 Mockito 创建模拟比在 Sling 模拟库中创建 JCR fixture from JSON file 更容易)。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          为 AEM 编写测试应该不难,Apache Sling 社区提供了在不同级别进行测试的方法,而且由于 AEM 基于 Sling,我们可以使用相同的工具。

          查看以下链接:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-26
            • 1970-01-01
            • 1970-01-01
            • 2012-09-04
            • 2017-06-13
            • 1970-01-01
            • 2015-10-17
            相关资源
            最近更新 更多