gpt4 book ai didi

java - OSGi 单元测试和包导出

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:00 27 4
gpt4 key购买 nike

什么是平衡包的声明导出和单元测试要求的最佳方式?

考虑要为其编写单元测试的包“mybundle”。 bundle 的源代码存储在 IDE 的“项目”概念中。例如:

mybundle
src/java
mybundle.package1
...java
bnd.bnd

单元测试 我指的是对单个 POJO 的测试,与更广泛的 OSGi 上下文无关,在这些上下文中,这些类可以在一个包中使用。在可能的情况下,测试应该可以通过“普通”类加载运行,例如通过 Eclipse 中的 JUnit 运行器。

在开发时,这里有几种打包单元测试的方法:

包源中的单元测试

在这里,单元测试被添加到项目中的源文件夹中:

mybundle
src/java
mybundle.package1
...java
test/java
mybundle.package1.test
...java
bnd.bnd

注意附加的 '.test' 以区分包并避免拆分包问题。

通常会有一些措施来确保测试类不会最终出现在构建的包 JAR 中。

在单独的包中进行单元测试

这里添加了一个单独的包,名称后缀为“.test”,这是一般约定。

mybundle
src/java
mybundle.package1
...java
mybundle.test
test/java
mybundle.package1.test
...java
bnd.bnd

这样做的问题是因为类是分离的,并且单元测试的运行可能不知道 OSGi 环境(例如使用 Eclipse JUnit 运行器),您将不得不装饰 JUnit 运行器的运行时类路径。

片段中的单元测试

(感谢@HollyCummins)。这里创建了一个单独的包片段:

mybundle.fragment
test/java
mybundle.package1.test
...java
bnd.bnd

该片段将“mybundle”声明为它的宿主,因此允许它共享“mybundle”中的类而无需导出包。

这样做的缺点是因为片段加载是一个OSGi概念,你需要用一个OSGi容器运行或者修饰classpath。

导出问题

当考虑 bundle 如何执行 Export-Package 时,问题就来了。 It is considered good practice to export as few packages as possible .然而,单元测试似乎强制导出额外的包。

这对于第二个选项来说最为明显,它有一个单独的测试包。测试包中的测试必须导入-打包被测类,并且被测包还必须导出-打包所有被测类。

因此,显而易见的解决方案是倾向于在包源代码中进行单元测试,但问题很快就会在非平凡的情况下出现。您可能想要共享测试代码,例如,您可能在单独的包中进行 OSGi 集成测试。要共享代码,您最终必须导出-打包测试包,然后当然您最终还会在构建的包中获得测试代码!

组织 OSGi 包/项目以进行测试的最佳方式是什么?

最佳答案

第三种选择是使用 OSGi 片段进行单元测试。这确保您的测试与要测试的代码共享一个类加载器,因此不需要额外的内部包导出。如果需要,测试片段甚至可以导出主包的内部包。该片段将有自己的包导入,因此它可以在不污染主包的包导入的情况下引入共享测试代码。

如上面的评论和更新的原始问题所述,使用片段仍然会给您留下一些关于如何处理构建和类路径的问题。如果您在 OSGi 容器之外运行您的测试,则片段的类加载器优势在很大程度上消失了,除了可能在您的 IDE 中拉入导入测试依赖项。

如果您在 OSGi 容器中运行测试,片段与普通包相比确实有一些缺点,这可能是个问题,具体取决于您如何驱动测试。片段不能声明激活器,因为它们没有独立的生命周期。声明式服务也不能以自然的方式从片段中注册,尽管蓝图服务通常 can .

关于java - OSGi 单元测试和包导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12372730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com