为 Eclipse 片段创建 JUnit 测试的正确方法是什么?

What is the right way to create JUnit tests for Eclipse fragments?

eclipse 片段最常见的用途之一是作为 JUnit 测试的容器 类。但是,当 Eclipse 片段扮演另一个更重要的角色时,如何为它编写 JUnit 测试呢?例如,当它具有特定于平台的代码时。

问题是无法为片段创建片段。而且您不能为主机插件编写测试来测试片段,因为它甚至不会编译,因为片段 "merged" 仅在运行时进入主机。

我不知道有什么令人满意的解决方案,但是,您可能需要考虑这些解决方法。

Eclipse-ExtensibleAPI

您可以像这样使用 Eclipse-ExtensibleAPI 清单 header

Eclipse-ExtensibleAPI: true

它导致片段导出的包被主机包re-exported。现在您可以创建一个导入所需包的测试包,因此可以访问片段中的 public 类型。

这不像 test-fragments 那样接近,您可以使用相同的 class 加载器从测试和生产代码中受益,该加载器可以访问 package-private 类型和方法。但是您至少可以通过 public 易访问的方式进行测试。

但是请注意,此 header 特定于 Eclipse PDE,而不是 OSGi 规范的一部分。因此,您被绑定到这个开发环境。此外,片段的包将通过其主机包导出,并且不仅对测试包可见,而且对所有包可见。

Java图书馆

如果您的片段几乎没有依赖项并且不需要 OSGi/Eclipse 运行时,您可以考虑将其视为普通 Java 库 w.r.t 测试。另一个同级 Java 项目可以包含测试并在片段项目上有一个 project-dependency (Properties > Java Build Path > Projects)。同样,无法访问 package-private 成员。

如果您使用像 Maven/Tycho 这样的构建工具,则需要一些额外的工作来声明依赖项并在构建过程中执行这些测试。

Bndtools

您还可以查看 Bndtools to see if this development tool fits your needs better than the Eclipse Plug-in Development Environment (PDE)

普通 JUnit 测试保存在与生产代码相同的项目中的单独源文件夹中。这将使您的测试代码以与使用 test-fragments 相同的方式访问生产代码。

Bndtools 还支持执行集成测试,但我怀疑您是否可以通过片段提供的服务或其他 API 以外的方式访问片段代码。

对于CI-builds,Bndtools项目通常在各自bnd(http://bnd.bndtools.org/)plug-in的帮助下使用Maven或Gradle。正如Maven/Tycho用于构建和打包PDE项目。

由于 Bndtools 是用于开发 OSGi 包的 IDE 扩展,它不知道 Eclipse plug-in 特性,例如 plugin.xml 中声明的扩展。因此,这些工件没有构建器和编辑器。但如果幸运的话,您甚至可以使用 PDE 构建器来显示无效扩展和扩展点的错误标记。

在同一个项目中拥有生产和 test-code 的另一个缺点是,纯测试依赖项,如 JUnit、模拟库等,在开发时对于生产代码也是可见的。

当然,生成的(片段)包既不包含测试代码也不包含测试依赖项。

但是,Bndtools 本身是用 Bndtools 开发的。所以有证据证明Bndtools可以用来写Eclipseplug-ins.