我正在研究一个基于Java 9(10)/ maven的项目,该项目实现了模块化架构,其中一个核心模块在以下位置加载了具有特定功能的许多模块运行。更多详细信息:
核心模块
是单个程序的入口点。实现一些基本的自举功能。
特定模块
垂直实现特定于域的功能,例如消息传递服务,文章管理等。
模块定义
通过实现所谓的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
单元测试特定模块的问题
就像所描述的那样,特定模块需要首先由内核加载,因为它们并不是独立运行的。他们需要引用会话对象(从核心)来访问持久层。换句话说:如果特定模块不是由内核加载的(就像特定模块单元测试中那样),则它们无法连接到数据源,因为它们没有引用会话对象。
我想为每个特定模块中的持久层实现单元测试。更确切地说,我想在每个特定模块的代码库中实现测试(由于一致性),而不是在核心代码库中实现。
您是否有想法,如何在不使用特定模块单元测试类(其中内核本身未知)内部的内核的情况下初始化会话对象?添加反向依赖项不是一种选择,因为这将导致循环依赖图(除了根据该体系结构这是一个肮脏的解决方案这一事实)。