【发布时间】:2017-05-02 21:12:36
【问题描述】:
eclipse 片段最常见的用途之一是作为 JUnit 测试类的容器。但是,当 Eclipse 片段扮演另一个更重要的角色时,如何为它编写 JUnit 测试呢?例如,当它具有特定于平台的代码时。
问题是无法为片段创建片段。而且您不能为主机插件编写测试来测试片段,因为它甚至不会编译,因为片段仅在运行时“合并”到主机中。
【问题讨论】:
标签: eclipse junit eclipse-plugin eclipse-rcp
eclipse 片段最常见的用途之一是作为 JUnit 测试类的容器。但是,当 Eclipse 片段扮演另一个更重要的角色时,如何为它编写 JUnit 测试呢?例如,当它具有特定于平台的代码时。
问题是无法为片段创建片段。而且您不能为主机插件编写测试来测试片段,因为它甚至不会编译,因为片段仅在运行时“合并”到主机中。
【问题讨论】:
标签: eclipse junit eclipse-plugin eclipse-rcp
我不知道一个令人满意的解决方案,但是,您可能需要考虑这些解决方法。
Eclipse-ExtensibleAPI
你可以像这样使用Eclipse-ExtensibleAPI清单头
Eclipse-ExtensibleAPI: true
它会导致由片段导出的包被主机包重新导出。现在您可以创建一个测试包来导入所需的包,因此可以访问片段中的公共类型。
这不像测试片段那样接近,您可以使用相同的类加载器从测试和生产代码中受益,该类加载器可以访问包私有类型和方法。但是您至少可以通过可公开访问的方式进行测试。
但是请注意,此标头特定于 Eclipse PDE,而不是 OSGi 规范的一部分。因此,您与此开发环境相关联。此外,片段的包将通过其宿主包导出,并且不仅对测试包可见,对所有包都可见。
Java 库
如果您的片段几乎没有依赖项并且不需要 OSGi/Eclipse 运行时,您可以考虑将其视为纯 Java 库并进行测试。另一个同级 Java 项目可能包含测试,并且在片段项目上具有项目依赖性(Properties > Java Build Path > Projects)。同样,无法访问包私有成员。
如果您使用 Maven/Tycho 之类的构建工具,则需要一些额外的工作来声明依赖项并在构建期间执行这些测试。
Bndtools
您还可以查看Bndtools,看看这个开发工具是否比 Eclipse Plug-in Development Environment (PDE) 更适合您的需求。
Plain JUnit 测试保存在与生产代码相同的项目中的单独源文件夹中。这将使您的测试代码以与使用测试片段相同的方式访问生产代码。
Bndtools 还支持执行集成测试,但我怀疑您是否可以通过片段提供的服务或其他 API 访问片段代码。
对于 CI 构建,Bndtools 项目通常在各自的 bnd(http://bnd.bndtools.org/) 插件的帮助下使用 Maven 或 Gradle。就像 Maven/Tycho 用于构建和打包 PDE 项目一样。
由于 Bndtools 是用于开发 OSGi 包的 IDE 扩展,它不了解 Eclipse 插件的特殊性,例如在 plugin.xml 中声明的扩展。因此,这些工件没有构建器和编辑器。但如果幸运的话,您甚至可以使用 PDE 构建器来显示无效扩展和扩展点的错误标记。
在同一个项目中包含生产代码和测试代码的另一个缺点是,在开发时,生产代码也可以看到纯测试依赖项,如 JUnit、模拟库等。
当然,生成的(片段)包既不包含测试代码也不包含测试依赖项。
但是,Bndtools 本身是使用 Bndtools 开发的。所以有证据证明Bndtools可以用来写Eclipse插件。
【讨论】:
Eclipse-ExtensibleAPI 是“PDE 使用的纯工具头文件,而不是 Eclipse 或 OSGi 运行时头文件”。因此,如果您使用它,则不应与 Equinox 绑定,而应与 Eclipse PDE 绑定。