单元测试OSGi组件

问题描述 投票:13回答:1

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

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

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

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

  • 在单元测试中,我们可以简单地使用setter方法但是谁会在OSGi容器中为我们这样做?
  • 对测试类进行子类化并覆盖创建者方法只有在测试类未声明为final时才有效。
java unit-testing osgi dependency-inversion
1个回答
8
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.