13

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

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

比如看这个案例。现在我想把它带入一个 OSGi 上下文......我们想在 OSGi 平台中提供任何类型的网络协议作为声明性服务,并想编写单元测试来测试直接与套接字对象。

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

  • 在单元测试中,我们可以简单地使用 setter 方法,但谁会在 OSGi 容器中为我们这样做呢?
  • 仅当未将测试类声明为 final 时,子类化测试类并覆盖创建者方法才有效。
4

1 回答 1

8

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

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

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

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

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

于 2011-08-10T10:59:33.307 回答