模块化体系结构中的单元测试,首先需要加载模块

时间:2018-06-21 10:47:08

标签: java unit-testing plugins architecture

我正在研究一个基于Java 9(10)/ maven的项目,该项目实现了模块化架构,其中一个核心模块在以下位置加载了具有特定功能的许多模块运行。更多详细信息:

核心模块

是单个程序的入口点。实现一些基本的自举功能。

  • 建立与数据源的连接,例如数据库会话(导致会话对象)。
  • 启动Web服务器(使用特定模块提供的Web服务)。

特定模块

垂直实现特定于域的功能,例如消息传递服务,文章管理等。

  • 使用内核提供的数据源会话对象与数据源进行交互。
  • 为核心模块提供网络服务,因此它们将由网络服务器加载。

模块定义

通过实现所谓的ModuleInterface来定义

所有特定模块,该setDataSource()定义了一组方法,例如ModuleInterface。就像在经典的插件架构中一样。 核心模块本身依靠ServiceLoader<ModuleInterface>与特定模块进行交互,例如加载它们。

模块加载过程

核心使用ServiceLoader<ModuleInterface> serviceLoader = ServiceLoader.load(ModuleInterface.class); for (ModuleInterface module : serviceLoader){ allLoadedModules.add(module); } 来加载位于模块路径上的所有模块。

for (ModuleInterface module : allLoadedModules) {
    module.setDataSource(dbSession)
}

此后,内核将通过调用已定义的setter方法为每个模块提供其会话对象。这样,每个模块都可以访问数据源。

<dependency>
    <groupId>x.y.z</groupId>
    <artifactId>ModuleInterface</artifactId>
    <version>xxx</version>
</dependency>

<dependency>
    <groupId>x.y.z</groupId>
    <artifactId>specific-mod-a</artifactId>
    <version>xxx</version>
</dependency>

...

Maven依赖项

所描述的依赖关系反映在maven中。核心模块取决于接口定义和特定的模块,以在其模块路径中提供它们。

<dependency>
    <groupId>x.y.z</groupId>
    <artifactId>ModuleInterface</artifactId>
    <version>xxx</version>
</dependency>

另一方面,特定模块不依赖于核心模块。它仅取决于接口定义。

OnUserResolvedClientScript

单元测试特定模块的问题

就像所描述的那样,特定模块需要首先由内核加载,因为它们并不是独立运行的。他们需要引用会话对象(从核心)来访问持久层。换句话说:如果特定模块不是由内核加载的(就像特定模块单元测试中那样),则它们无法连接到数据源,因为它们没有引用会话对象。

我想为每个特定模块中的持久层实现单元测试。更确切地说,我想在每个特定模块的代码库中实现测试(由于一致性),而不是在核心代码库中实现。

您是否有想法,如何在不使用特定模块单元测试类(其中内核本身未知)内部的内核的情况下初始化会话对象?添加反向依赖项不是一种选择,因为这将导致循环依赖图(除了根据该体系结构这是一个肮脏的解决方案这一事实)。

0 个答案:

没有答案