什么是平衡包的声明导出和单元测试需求的最佳方式?
考虑一个名为“mybundle”的捆绑包,您想编写单元测试。该捆绑包的源代码存储在IDE的“项目”概念中。例如:
我指的是针对个人POJO的单元测试,与这些类在bundle中使用时所处的更广泛的OSGi上下文无关。在可能的情况下,测试应该能够使用“普通”的类加载运行,例如通过Eclipse中的JUnit运行器。
在开发时,有几种方法可以打包单元测试:
请注意附加的“.test”以区分包并避免拆分包问题。
通常会采取一些措施确保测试类不会出现在构建的捆绑JAR中。
在单独的包中进行单元测试
在这里添加了一个单独的包,名称后缀为“.test”,这是一般惯例。
这样做的问题在于,由于类是分离的,并且单元测试的运行可能不了解OSGi环境(例如使用Eclipse JUnit运行程序),因此您需要装饰JUnit运行程序的运行时类路径。
该片段将“mybundle”声明为其主机,从而允许它共享“mybundle”中的类,无需导出包。
缺点是,由于片段加载是一个OSGi概念,因此您需要在OSGi容器中运行或装饰类路径。
出口问题
当考虑如何执行Export-Package时,问题就出现了。认为尽可能少地导出包是一种良好的做法。但是似乎单元测试会强制导出额外的包。
这对于第二个选项最为明显,即具有单独的测试包。测试包中的测试必须Import-Package下的类,而要测试的包也必须Export-Package所有所述类。
因此,明显的解决方案是倾向于在包源中进行单元测试,但是在非平凡情况下很快会出现问题。您可能希望共享测试代码,例如,您可能在单独的包中进行OSGi集成测试。为了共享代码,您最终不得不Export-Package测试包,然后当然还会在构建的包中使用测试代码!
什么是组织OSGi bundles / projects进行测试的最佳方法?
考虑一个名为“mybundle”的捆绑包,您想编写单元测试。该捆绑包的源代码存储在IDE的“项目”概念中。例如:
mybundle
src/java
mybundle.package1
...java
bnd.bnd
我指的是针对个人POJO的单元测试,与这些类在bundle中使用时所处的更广泛的OSGi上下文无关。在可能的情况下,测试应该能够使用“普通”的类加载运行,例如通过Eclipse中的JUnit运行器。
在开发时,有几种方法可以打包单元测试:
Bundle源代码中的单元测试
在这里,将单元测试添加到项目中的源文件夹中: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)。 这里创建了一个单独的bundle片段:mybundle.fragment
test/java
mybundle.package1.test
...java
bnd.bnd
该片段将“mybundle”声明为其主机,从而允许它共享“mybundle”中的类,无需导出包。
缺点是,由于片段加载是一个OSGi概念,因此您需要在OSGi容器中运行或装饰类路径。
出口问题
当考虑如何执行Export-Package时,问题就出现了。认为尽可能少地导出包是一种良好的做法。但是似乎单元测试会强制导出额外的包。
这对于第二个选项最为明显,即具有单独的测试包。测试包中的测试必须Import-Package下的类,而要测试的包也必须Export-Package所有所述类。
因此,明显的解决方案是倾向于在包源中进行单元测试,但是在非平凡情况下很快会出现问题。您可能希望共享测试代码,例如,您可能在单独的包中进行OSGi集成测试。为了共享代码,您最终不得不Export-Package测试包,然后当然还会在构建的包中使用测试代码!
什么是组织OSGi bundles / projects进行测试的最佳方法?