java - 使用 Gradle、JUnit 和 Mockito 的模块化 Java 的推荐项目结构

标签 java gradle junit mockito java-module

我正在尝试迁移大型 code base从 Java 8 到模块化 (JPMS) Java 11,我遇到了巨大的痛苦,并且很难找到有关项目结构以及如何在实际生产项目中使用模块信息文件的一致建议。

相关项目遵循源文件和测试文件的传统 gradle 结构:

src/main/java/org/abc/...
src/test/java/org/abc/...

我在 src/main/java/module-info.java 中有一个 module-info.java 文件,这是正确的位置吗? quick-start对于模块化 java 和 this似乎与此相矛盾;然而other resources按照我的方法做。

当尝试运行如下所示的单元测试时:

@RunWith(MockitoJUnitRunner.class)
public class ABCTest {
    @Mock
    public SomeClass mock;

    ...
}

我得到:

Unable to make field public SomeClass mock accessible: module org.abc does not "exports org.abc" 
to module org.mockito

这表明我需要在我的module-info.java文件中添加exports org.abc to org.mockito,但这看起来很笨拙且冗长对于我的测试树中的所有子包,它们甚至不是模块的一部分,而且这似乎是错误的地方,因为测试不应该与发布 jar 一起导出。

看似最新的指导 I could find建议将 module-info.[test|java] 文件添加到我的测试树中。这两个文件(.java.test)有什么区别?我在谷歌上找不到任何解释这一点的点击。另外,我应该必须将内容从 main/java/module-info.java 复制到 test/java/module-info.test 并保留它们同步中?这看起来很乏味。

我还了解到 gradle 还没有对模块化 java 的 native 支持,并且必须依赖插件来实现这一点,应该使用哪些“事实上的”插件?

我对可用的信息感到困惑,它似乎是矛盾的,水平非常低或在使用 gradle 时不适用。有人可以提供一个使用mockito、junit、gradle 和模块化java(版本9+,最好是11)的常规源布局示例项目吗?

最佳答案

正如您所发现的,Gradle 没有内置的对 JPMS 的开箱即用支持。

Gradle 的 JPMS 政策可以总结为 this comment来自 Gradle 核心开发人员之一...

„...There's no short-term plan to work on jigsaw support, so please don't hold your breath...“

我开发了a plugin that JPMS-enables Gradle and Eclipse不过。

Here is a simple test project它是使用 Gradle、JPMS、JavaFX 13、JUnit 4 和 Mockito 实现的。 The mrJar JPMS 开发支持插件将这一切联系在一起。

您可以运行 :test 任务或 :run 仅使用原始 Gradle 从命令行执行该测试项目的任务。或者按照以下步骤在 Eclipse 中使用测试项目...

  1. 将项目导入 Eclipse

  2. 执行 :eclipse Eclipse 中的任务 Gradle Tasks 查看

    • 这就是触发 mrJarEclipse Modulefication 功能的原因
  3. 打开项目的属性对话框

    • 转到 Java Build Path 属性选项卡
    • 注意标题栏中的通知 ( Not all modules could be found. Click Apply to synchronize )
    • 点击Apply 按钮同步模块路径
  4. 执行 :test 任务

    • 或者, Run As Gradle Test 来自 Package Explorer 上下文菜单
    • 或者再次执行 :check 任务是另一个选项,它具有与 :eclipse 相同的 Eclipse Modulefication 效果。 :test Run As Gradle Test

The recording可能有助于阐明在 Eclipse 中运行单元测试和 JavaFX 应用程序所需遵循的步骤。

希望您会发现随附的测试项目非常简单。但如果你遇到困难,还有更详细的使用说明和屏幕录制in this Gradle Communnity Forum thread

我也很高兴在该论坛帖子中与您互动,并澄清视频或任何步骤中可能不明显的任何内容。

<小时/>

此外,here's a github repository带有完全支持 JPMS 的项目副本 @EmilyL...

JPMS Modules Made Easy

关于java - 使用 Gradle、JUnit 和 Mockito 的模块化 Java 的推荐项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237083/

相关文章:

java - Android Studio - gradle 警告 : All com. android.support 库必须使用完全相同的版本规范

java - Spring MVC 和 JUnit : Failed to load ApplicationContext

在 maven 中使用 httpunit 进行 servlet 测试时,项目类路径中缺少 java ee api

java - Jsp header 中的用户名

java - 单击按钮时略有延迟

java,用鼠标角度旋转BufferedImage

android - 将项目导入Android Studio后同步时出错:找不到com.android.tools.build:gradle:4.0.1

java - Gradle 无法在 java 和 groovy 中运行测试

Java Swing : How can I change the size of one row in a Grid layout and allow it to resize dynamically only horizontally and not vertically?

java - 如何在 Java 中以编程方式使用 unix 命令来删除生成的目录