java - 单元测试 OSGi 组件

标签 java unit-testing osgi dependency-inversion

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

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

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

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

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

最佳答案

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

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

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

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

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

关于java - 单元测试 OSGi 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7004165/

相关文章:

javascript - 语言之间的 Unix 时间转换

unit-testing - Flutter 中的单元测试通过 BuildContext

java - 通知等待线程更改变量

unit-testing - CakePHP 3 : Set current time for unit testing

c# - 在 MSTest 中模拟 ASP.NET Core 中的 TempData

java - OSGi java.lang.NoClassDefFoundError : org/osgi/framework/BundleContext

maven - 使用 Maven Surefire 运行 MagicDraw 测试

java - 在 OSGi 引用注释中动态设置目标属性

java - 将代码推送到 bitbucket 时构建 jenkins 作业

java - 使用同一对象将不同级别记录到不同文件