java - 单元测试 AEM 6.1 和模拟 sling、Jcr 和 Osgi

标签 java unit-testing aem

背景

你好,

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

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

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

问题

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

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

前进...

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

最佳答案

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

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

  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,其中包含我们编译和单元测试 Java 代码所需的 AEM 实例中的所有 .jar 文件。但最近的 AEM 版本在 Uber .jar 中提供了这一点,这使得这项任务变得更加容易。我们还使用 Mockito 对 Java 代码进行单元测试。它允许对我们依赖的 Sling 和 AEM 类进行简单而强大的模拟。我们一直在使用它。我们偶尔也会使用 PowerMockito 进行一些模拟。

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

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

关于java - 单元测试 AEM 6.1 和模拟 sling、Jcr 和 Osgi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39838340/

相关文章:

java - 打印出小于给定数 N 的素数

c# - 为了单元测试更改方法可见性是否可以?

c# - FluentAssertions : int. Should().Equals 返回错误结果?

c# - 对与文件系统的交互进行单元测试的好方法是什么?

apache - 在 Apache 服务器上运行的 AEM Dispatcher 上缓存视频返回 206

html - 在 AEM 的文本 RTE 组件中调整 html 卡片元素的边距

java - 返回巨大的 JSON,而不是简单的 JSON

java - 为什么我要使用 Android Studio 的 "Expand Boolean"Intention?

Java GPIO 解构函数

java - 如何在rteplugins下为richtext组件添加图像插件