unit testingOSGi组件

我目前正在考虑“如何设计一个OSGi组件,以便使用jUnit和Mockito等框架轻松编写测试”

由于OSGi强化DIP (依赖性倒置原则)并且通常存在注入器方法(例如,设置器),因此模拟捆绑间依赖性非常容易。
但是捆绑内部依赖呢?

例如,看看这个案例 。 现在我想将它带入一个OSGi上下文…我们希望在OSGi平台中提供任何类型的网络协议作为声明服务,并希望编写unit testing来测试直接与之交互的较低网络代码套接字对象。

如果我们将套接字创建重构为一个单独但仍然捆绑的内部POJO (Plain Old Java Object)类,我们应该如何将它注入协议实现?

  • 在unit testing中,我们可以简单地使用setter方法但是谁会在我们的OSGi容器中执行此操作?
  • 对测试类进行子类化并覆盖创建者方法只有在测试类未声明为final时才有效。

严格来说,测试与OSGi容器的交互是一种集成测试。 为此你可以使用Pax考试 ,它有点繁琐,但工作得很好(特别是如果你使用maven和/或karaffunction)。

此外,您可以使用TinyBundles ,它可以在您的测试中动态创建可部署的软件包/片段(非常酷),以模拟其他软件包/片段,以确保软件包间集成,而不会带来完整的环境。

对于单元或小规模集成测试(即没有容器),您可以根据需要模拟BundleContext(或者如果使用DS,还可以使用DS)。

在要点中我对你的问题有点不清楚。 如果有一个内部POJO,那么你有责任通过setter连接依赖关系,否则如果它暴露给OSGi服务注册表,那么框架(DS或ServiceTracker)就会解决依赖关系。

同样inheritance某些东西以覆盖创建者方法意味着你不再测试原始类 – 这是代码气味 – 尝试重构它以将创建者代码作为单独的类(构造函数或setter)传递,然后这个新的创建者代码(套接字创建)可以独立测试(不考虑OSGi,甚至不考虑使用它的协议类)。

Interesting Posts