单元测试 OSGi 组件

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

模拟捆绑包间依赖关系非常容易,因为OSGi加强了DIP(依赖关系反转原则)和注入器方法(例如setter)通常存在。
但是捆绑软件内部依赖关系呢?

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

如果我们将套接字创建重构为一个单独但仍然捆绑内部POJO(普通旧Java对象)类,我们应该如何将其注入协议实现中?

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

答案 1

严格来说,测试与OSGi容器的交互是一种集成测试。为此,您可以使用Pax Exam,掌握窍门有点麻烦,但效果非常好(特别是如果您使用的是maven和/或karaf功能)。

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

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

我对你在要点中的问题有点不清楚。如果有一个内部POJO,那么你有责任通过 setter 连接依赖项,否则如果它向 OSGi 服务注册表公开,则依赖项由框架(DS 或 ServiceTracker)解析。

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


答案 2

推荐