当前位置: 首页 > 面试题库 >

Java 9 + Maven + JUnit:测试代码是否需要自己的module-info.java以及放在哪里?

孔阳炎
2023-03-14
问题内容

假设我有一个使用Maven
3和junit的Java项目。有src/main/javasrc/test/java目录分别包含主要来源和测试来源(所有内容都是标准的)。

现在,我想将项目迁移到Java9。src/main/java内容表示Java 9模块。有com/acme/project/module- info.java看大约是这样的:

module com.acme.project {
    require module1;
    require module2;
    ...
}

如果测试代码module- info.java本身需要怎么办?例如,添加对某些模块的依赖关系,该依赖关系仅用于测试,而对于生产代码则不需要。在这种情况下,我必须把module- info.javasrc/test/java/com/acme/project/给模块不同的名称。这样,Maven似乎将主源和测试源视为不同的模块,因此我必须将包从主模块导出到测试模块,并在测试模块中需要包,如下所示:

主模块(在中src/main/java/com/acme/project):

module prod.module {
    exports com.acme.project to test.module;
}

测试模块(中src/test/java/com/acme/project):

module test.module {
    requires junit;
    requires prod.module;
}

这产生

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project test-java9-modules-junit: Compilation failure: Compilation failure:
[ERROR] /home/rpuch/git/my/test-java9-modules-junit/src/test/java/com/acme/project/GreeterTest.java:[1,1] package exists in another module: prod.module

因为一个包在两个模块中定义。所以现在我必须在主模块和测试模块中有不同的项目,这不方便。

我觉得我走错了路,这一切看起来都很丑陋。如何module- info.java在测试代​​码中拥有自己的功能,或者require没有它如何实现相同的效果(,等)?


问题答案:

模块系统无法区分生产代码和测试代码,因此,如果您选择模块化测试代码,则prod.moduletest.module不能共享相同的包com.acme.project,如规格中所述:

互不干扰
-Java编译器,虚拟机和运行时系统必须确保包含相同名称的程序包的模块不会相互干扰。如果两个不同的模块包含相同名称的程序包,则从每个模块的角度来看,该程序包中的所有类型和成员都仅由该模块定义。一个模块中该程序包中的代码必须不能访问另一模块中该程序包中的程序包专用类型或成员。

正如艾伦·贝特曼(Alan Bateman)所指出的那样,当在src / test / java树中编译代码时,Maven编译器插件使用--patch-
module和
模块系统提供的其他选项,以便使用测试类扩展被测模块。而且,在运行测试类时,Surefire插件也可以完成此操作(请参阅“
支持在命名的Java
9模块中运行单元测试”)。这意味着您无需将测试代码放在模块中。



 类似资料:
  • 这就产生了 因为一个包是在两个模块中定义的。所以现在我必须在主模块和测试模块有不同的项目,这不方便。 我觉得我走错了路,一切开始变得很难看。我如何在测试代码中拥有自己的,或者没有它我如何实现相同的效果(等)?

  • 从project Jigsaw的快速入门教程中,似乎module-info.java会转到一个带有模块名称的目录中,例如,对于包含类myclass的模块my.module: 然后,仍然按照教程,在调用MyClass(假设它有)时,模块路径选项被赋予目录: 到目前为止,一切都很好。 我不明白为什么两者都起作用。 如果包含两个模块,则没有区别:如果两个目录都在模块路径中,第二个版本仍然可以工作(如果只

  • 问题内容: 如何为Phone对象模拟对象。 波纹管 谢谢 问题答案: 首先,我要做一些假设。 与无副作用的影响。该是对你并不重要。 这样,您的课程就变成了: 因此,您的测试有两个条件。要么是“测试”,然后返回“完成”,要么不是,然后返回“失败”。 那么如何设置设置为“ ”。可以肯定的是,我们需要能够从测试中设置“名称”。为此,我们需要“注入”它(我们可以通过其他多种方式来实现它,但是我喜欢注入)。

  • 问题内容: 关于组织单元测试,我有两个问题。 我是否必须将测试放在与测试类相同的程序包中,或者可以在不同程序包中组织测试? 例如,如果我具有 有效性 和 其他 测试,即使它们属于同一班级,将它们分成不同的包是否正确? 模拟和存根类呢?我应该将它们与仅包含测试的软件包分开,还是放在一起? 问题答案: 我们执行JUnit测试用例的方法是将它们放在相同的包中,但放在不同的根目录中。由于我们使用Maven

  • 问题内容: 在我的代码中,仅当它在JUnit测试中运行时,才需要进行某些修复。如何确定代码是否在JUnit测试中运行?是否有类似JUnit.isRunning()== true的东西? 问题答案: 如果您要以编程方式确定要运行哪个“配置文件”,则可能是一个好主意。考虑使用Spring Profiles进行配置。在集成测试中,您可能需要针对其他数据库进行测试。 这是经过测试的有效代码

  • 我只是试图释放我的Java9兼容的项目与。但是,它在中失败 无法执行目标组织。阿帕奇。专家插件:maven编译器插件:3.7.0:在项目电子邮件上编译(默认编译):致命错误编译:无效目标版本:9 有趣的是,在我独立运行时运行良好。我的设置: Maven版本3.5.0。 运行良好; 失败与上述异常。 调试输出: