生产代码 + 测试模块信息 = 不可能?



我有一个模拟类,其中包含我从模块提供的服务的简单实现。 我使用的是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;
}

我已经在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;,我的测试代码中对主代码分支的每个引用都会给出"错误:找不到符号"。使用requires myModule;,我得到一个"错误:涉及myModule的循环依赖"。

所以......我的测试不能在不同的模块中。 而且它们不能是同一个模块! [删除了一长串咒骂词]

  • 如何在测试代码中引入服务的模拟版本,而不是创建一个完全不同的模块/gradle 子项目?

  • 或者这只是一种不可能的情况,虽然你可以有一个单独的测试模块信息,但你不能用它做太多事情?

  • 或者有没有某种方法可以在运行时动态加载东西,这样我就不必将每个小模拟服务放在任何模块信息、测试或其他内容中? 这样ServiceLoader.load()就会找到它们。 嗯。。。也许扩展ServiceLoader并将其用法包装在主代码中,以便它将在生产代码或测试代码中使用正确的用法......

a( 欢迎来到"模块化世界中的测试"!

TL;DR https://sormuras.github.io/blog/2018-09-11-testing-in-the-modular-world.html

拥有一个或多个专用测试模块是件好事。带着所有的花里胡哨,阅读module-info.java宣言。这些测试模块是主模块的第一个客户端。只需确保在编译和运行测试模块之前,构建工具打包所有主要模块即可。否则,您不会尽可能接近现实地测试您的主模块 — 其他人会将您的主模块用作 JAR 文件。你也应该如此。这也解决了服务和多版本 JAR 的所有问题。

现在有趣的部分:模块内测试,也称为白盒测试。或者测试类型如何驻留在非导出包或包私有类型中导出包?要么使用知道如何在测试编译和/或测试运行时将测试模块修补到主模块(反之亦然(的构建。像pro或Bach.java(我维护(,或者在您使用Gradle的情况下,请参阅此答案的b(elow部分。

b( Gradle 和 Java maintest , ...模块不是开箱即用的朋友,但

最佳基于插件的解决方案:https://github.com/java9-modularity/gradle-modules-plugin - 它尊重在测试运行时module-info.test配置文件(我发明的(传递这些java命令行选项。在这里,您基本上通过冗长的命令行选项来描述您的测试模块要求,尽管已经存在完美的DSL:module-info-java...循环回 a( 和模块感知构建工具。

c( IntelliJ IDEA和Java测试模块是...提高!

  • 2019.3 中的 https://youtrack.jetbrains.com/issue/IDEA-171419 module-info.java支持
  • https://youtrack.jetbrains.com/issue/IDEA-222831 module-info.test支持,很快?

相关内容

  • 没有找到相关文章

最新更新