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

2023-11-24

我有一个模拟类,其中包含我从模块提供的服务的简单实现。我正在使用 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并将其用法包装在主代码中,以便它将在生产代码或测试代码中使用正确的用法...


a) 欢迎来到“模块化世界中的测试”!

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

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

现在有趣的部分:模块内测试,也称为白盒测试。或者如何测试驻留在非导出包中的类型或导出包中的包私有类型?使用知道如何在测试编译和/或测试运行时将测试模块修补到主模块(反之亦然)的构建。喜欢pro or 巴赫.java(我坚持这样做),或者在您使用 Gradle 的情况下,请参阅此答案的 b)以下部分。

b) Gradle 和 Javamain, test, …模块还不是开箱即用的朋友

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

c) IntelliJ IDEA 和 Javatest模块正在……改进!

  • https://youtrack.jetbrains.com/issue/IDEA-171419 module-info.java2019.3支持
  • https://youtrack.jetbrains.com/issue/IDEA-222831 module-info.test支持一下,快了?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生产代码+测试模块信息=不可能? 的相关文章

  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • Symfony2 条件服务声明

    我目前正在尝试找到一个可靠的解决方案来动态更改 Symfony2 服务的依赖关系 详细信息 我有一个服务 它使用 HTTP 驱动程序与外部 API 进行通信 class myAwesomeService private httpDriver
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • 让 eclipse 调试我的 android 项目

    我正在使用 Eclipse 编写 Android 应用程序 当我单击左侧树视图中的项目 然后单击 调试 时 IDE 会构建一个 APK 并按预期安装在模拟器 设备中 但是 如果我正在编辑文件并且忘记在尝试调试之前首先单击该项目 那么 IDE
  • 如何在网格视图的行命令中找到该控件?

    我怎么能够在 row 命令中找到控件网格视图 实际上 GridViewCommandEventArgs 中没有 Row 因此您需要从命令源命名容器中获取行 GridViewRow row GridViewRow Control e Comm
  • .NET 中的 Java 小程序相当于什么?

    NET 中的 Java 小程序相当于什么 是银光吗 Java applet 还在广泛使用吗 1997 年 当 Java 1 0 发布时 Java applet 是 新的热门事物 几年后 它们变得越来越不受欢迎 主要是因为在计算机上安装Jav
  • 如何实现像Gallery一样的Horizo​​ntalScrollView?

    I want to implement Horizontal ScrollView with some features of Gallery 在图库中 滚动条在一定距离处成对排列 即如果屏幕上显示三个图像 单击最后一个图像将排列在中心 我
  • 通过自动解锁从类返回锁定的资源

    我想要一个返回指向资源的指针的类成员函数 资源应自动锁定和解锁 我考虑创建一个不可复制的对象来处理锁定 您认为以下是一个好的解决方案吗 它是线程安全的吗 STL 中是否已有适用于此用例的工具 template
  • Scala String* 类型(在函数 args 中)

    我有以下方法 def m a String 我想知道此语法中星号 符号的用途是什么 我显然是 Scala 的新手 我用谷歌搜索 但可能搜索错误的东西 任何帮助表示赞赏 Cheers 它被称为 var args 变量参数 def concat
  • 我可以在批处理脚本中的一个“查找”命令中搜索多个字符串吗?

    我有一个 Windows 批处理脚本 它将在文件中查找字符串 find i WD6 Inputpath file txt if errorlevel 0 GOTO somestuff 目前 这就是我的代码的样子 我遇到了一个新字符串 我想在
  • 如何使用 C#6“使用静态”功能?

    我正在看其中的几个新功能在C 6 具体来说 使用静态 using static is a new kind of using clause that lets you import static members of types direc
  • 关于 NaN 运算的问题

    我的 SSE FPU 生成以下 NaN 当我执行任何基本的对偶运算 如 ADDSD SUBSD MULSD 或 DIVSD 并且两个操作数之一为 NaN 时 结果具有 NaN 操作数的符号 并且结果尾数的低 51 位将加载NaN 操作数尾数
  • Rails:金钱宝石将所有金额转换为零

    我正在尝试使用金钱宝石在我的应用程序中处理货币 但我遇到了一个奇怪的错误 这就是我的 记录 模型中的内容 composed of amount class name gt Money mapping gt w cents cents w c
  • AddWithValue 参数为 NULL 时出现异常

    我有以下代码用于指定 SQL 查询的参数 我使用时遇到以下异常Code 1 但当我使用时效果很好Code 2 In Code 2我们检查是否为空 因此if else block 例外 参数化查询 application ex id nvar
  • 检查字符串是否不为 Null 且不为 Empty

    如何检查字符串是否不是null并且不为空 public void doStuff String str if str null str here I want to check the str is empty or not handle
  • Eclipse“服务器位置”部分已禁用,需要更改为使用 Tomcat 安装

    我已经在 Eclipse 中设置了一个动态 Web 项目 并安装了 Tomcat 5 5 我想将服务器设置为 Tomcat 安装而不是工作区元数据位置 但是当 Eclipse 显示服务器的 概述 屏幕时 服务器位置 部分被禁用 因此我无法更
  • 如何动态地将 swt 小部件添加到组合中?

    我正在尝试通过单击按钮将文本框 按钮等小部件添加到组合中 我已经尝试过 但我只能动态添加这些小部件 最多可达复合材料的大小 我的 jface 对话框是这样的 它有一个滚动的组合 其中包含一个组合 在主要复合材料中 我还有 3 个其他复合材料
  • Android glSurfaceView 使用 XML/Java 进行覆盖

    我启动了一个 Android OpenGL 应用程序 并且有以下类 class A extends Activity class B extends GlSurfaceView implements Renderer 当调用A类的onCre
  • log4j2 JDBC Appender 问题:插入记录失败

    我创建了一个 JDBC 附加程序并绑定 ColumnConfig 和 DataSourceConnectionSource 在尝试在数据库中插入记录时 Logger debug Test 我遇到以下异常 Thanks 6 16 14 18
  • ipython 控制台中的语法高亮显示

    我在用ipython同时在qtconsole并在终端中 In ipython qtconsole 当我输入时import pandas as pd这些单词有语法突出显示 但是 当我在控制台中输入时 所有文本都是白色的 Python 控制台也
  • 如何将模式作为参数传递给sql server中的存储过程?

    我有一个存储过程来根据两个表选择数据列表 第一个表是固定的 CO Country 但第二个表可以是多个表之一 表本身的名称是相同的 Location 但是 表的架构不同 ABD Location CGA Location GBN Locat
  • include() 不适用于所有浏览器

    这是我的代码块 它在 fireFox 和 Chrome 中完美运行 但在 IE 中不行 我收到错误 Object doesn t support property or method includes function rightTreeS
  • 生产代码+测试模块信息=不可能?

    我有一个模拟类 其中包含我从模块提供的服务的简单实现 我正在使用 OpenJDK 11 03 gradle 5 2 1 和 IntelliJ 2019 2 In main code myPackage myService java I ha