我有一个模拟类,其中包含我从模块提供的服务的简单实现。我正在使用 OpenJDK 11.03、gradle 5.2.1 和 IntelliJ 2019.2。
In /main/code/myPackage/myService.java
I have:
package myPackage;
class myService {
public abstract void someFunction();
}
而在我的test/code/somePackage/myMockService
I have:
package myPackage;
// no import, they're in the same package.
class myMockService extends myService {
@Override
public void someFunction() { System.out.prinln("Hello World"); }
}
In my main/code/module-info.java
I have:
module myModule {
exports somePackage;
}
我尝试过几种变体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;
,我的测试代码中对主代码分支的每次引用都会给出“错误:找不到符号”。With a requires myModule;
,我收到“错误:涉及 myModule 的循环依赖”。
所以...我的测试不能在不同的模块中。而且它们不能是同一个模块! [删除一长串脏话]
-
如何在测试代码中引入服务的模拟版本,而不是创建完全不同的模块/gradle 子项目?
-
或者这只是一种不可能的情况,而您can有一个单独的测试模块信息,你不能用它做太多事情?
-
或者是否有某种方法可以在运行时动态加载内容,这样我就不必将每个小模拟服务放入任何模块信息、测试或其他中?这样ServiceLoader.load()
会找到他们的。嗯...也许可以延长ServiceLoader
并将其用法包装在主代码中,以便它将在生产代码或测试代码中使用正确的用法...