我有一个模拟类,其中包含我从模块提供的服务的简单实现。我正在使用 OpenJDK 11.03、gradle 5.2.1 和 IntelliJ 2019.2。
在/main/code/myPackage/myService.java
我有:
package myPackage;
class myService {
public abstract void someFunction();
}
在我的test/code/somePackage/myMockService
我有:
package myPackage;
// no import, they're in the same package.
class myMockService extends myService {
@Override
public void someFunction() { System.out.prinln("Hello World"); }
}
在我的main/code/module-info.java
我有:
module myModule {
exports somePackage;
}
我在 a 上尝试了几种变体test/code/module-info.java
,但均未成功。例如:
// "open module" lets anyone use reflection within (mostly JUnit 5 in my case)
import myPackage.myService;
import myPackage.myMockService;
open module myTestModule {
exports myPackage;
provides myService with myMockService
}
以上module-info.java
关于“模块名称 myTestModule 与预期名称 myModule 不匹配”、“包 'myPackage' 不可见”(来自 myMockModule.java)的错误,解释了“包 myPackage 在模块 myModule 中声明但模块 myTestModule 未读取它"
另一方面,使用以下内容module-info.java
,我得到了不同批次的错误(在代码下方)
import myPackage.myService;
import myPackage.myMockService;
open module myModule {
provides myService with myMockService;
}
如果没有requires myModule;
,我的测试代码中对主代码分支的每次引用都会给出“错误:找不到符号”。 使用a requires myModule;
,我得到一个“错误:涉及 myModule 的循环依赖”。
所以......我的测试不能在不同的模块中。而且它们不能是同一个模块![删除一长串脏话]
如何在测试代码中引入服务的模拟版本,而不是创建完全不同的模块/gradle 子项目?
或者这只是一个不可能的情况,虽然你可以有一个单独的测试模块信息,但你不能用它做很多事情?
或者有什么方法可以在运行时动态加载东西,这样我就不必把每一个小模拟服务都放在任何模块信息、测试或其他地方?这样
ServiceLoader.load()
就会找到他们。嗯......也许ServiceLoader
在主代码中扩展和包装它的用法,以便它在生产代码或测试代码中使用正确的......