如何使用 Junit 5 测试服务提供商实现模块?

2023-12-02

这是我的基本模块,需要实现 myspi 包中定义的接口。各种提供商都可以提供 MyProvider 实现。基础模块通过 myspi.MyProvider 接口实现使用它们。

module base {
    exports myspi;
    uses myspi.MyProvider;
}

这是我的示例实现模块,它通过 MyProviderImpl 提供 MyProvider 实现

module myspi.provider {
    provides myspi.MyProvider with myspi.provider.MyProviderImpl;
}

当我在基本模块中加载实现时,所有这些工作正常

public static List<MyProvider> getMyProviders() {
        var myProviders = new ArrayList<MyProvider>();
        for (MyProvider myProvider : ServiceLoader.<MyProvider>load(MyProvider.class)) {
            myProviders.add(myProvider);
        }
        return myProviders;
    }

但相同的代码在 Junit 5 测试代码中返回空列表(ServiceLoader 返回 null)。如何使用 Junit 5 测试服务提供程序模块。或者是否有 Junit 的替代方案,允许我们创建测试模块(模块化测试 API),在模块信息中声明“使用 myspi.MyProvider”,并与 getMyProviders( )?


基本上你走在正确的轨道上。当涉及到解析模块是测试运行时时,您需要让 Java 模块系统相信您的测试模块是唯一的来源。

黑盒测试很容易。

模块化世界中的白盒测试,意味着测试模块内的受保护成员和打包私有成员,是很棘手的。至少有两种方法可以实现此目的:a)使用 java 命令行选项在测试启动时配置 Java 模块系统或 b)混合main来源进入test编译时源并维护专用module-info.java在你的test来源。

请访问博客和示例的链接,网址为如何使用 jdk > 1.8 进行模块化构建为了方便起见,摘录如下:

Examples

  • 正在进行中的蓝图https://github.com/sormuras/sandbox/tree/master/sors-modular-testing-blueprint

  • 以“modular-world-”开始的集成测试https://github.com/sormuras/junit-platform-maven-plugin/tree/master/src/it

背景和其他资源

  • https://github.com/junit-team/junit5-samples/tree/master/junit5-modular-world
  • https://github.com/forax/pro
  • https://blog.codefx.org/java/ Five-command-line-options-to-hack-the-java-9-module-system/

并且预计大多数 IDE 也不支持您。目前。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Junit 5 测试服务提供商实现模块? 的相关文章

  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 无法解析类型为 xxx 的任何 bean;限定符:[@javax.enterprise.inject.Any()]

    我有一个 LoginProvider 接口 public interface LoginProvider boolean login String username String password 以及两种不同的实现 public clas
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

    我正在开发一个项目 但收到错误 隐式超级构造函数 Person 未定义 必须显式调用另一个构造函数 我不太明白它 这是我的人物课程 public class Person public Person String name double D
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 为什么java中的for-each循环中需要声明变量

    for 每个循环的通常形式是这样的 for Foo bar bars bar doThings 但如果我想保留 bar 直到循环结束 我可以not使用 foreach 循环 Foo bar null Syntax error on toke
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • Java:拆箱整数时出现空指针异常?

    此代码导致空指针异常 我不知道为什么 private void setSiblings PhylogenyTree node Color color throws InvalidCellNumberException PhylogenyTr
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也

随机推荐

  • 如何重新排列 PDF 文件的页面顺序?

    我最后正在生成目录 我想将目录移动到开头 假设我的 PDF 有 16 页 目录从第 13 页开始到第 15 页结束 我想将目录移至第二页 这样第一页仍为第 1 页 最后一页仍为第 16 页 这段代码没有给我我想要的 public void
  • 如何从 aframe 中的 3D 对象获取边界框信息?

    我正在开发一个 aframe 项目 该项目涉及将未知大小的 3D 对象加载到我的场景中 当然 在将对象放入场景之前 我希望将其大小调整到一定的大小 例如固定高度 但是如何从对象的边界框中提取宽度 高度和深度等信息呢 您需要在此处使用 A F
  • 我如何在原型工作中得到“this = this”

    好吧 偷看 所以我知道弄乱原型是不好的做法 但无论如何 Array prototype rev function this reverse 工作正常 更新源数组变量 ary 如预期 例如 ary 123 456 ary rev result
  • 在 ggplot2 中用梯度和变化的图例特征标记线条

    我正在使用以下数据查看 1954 年至 2000 年每月最高气温的变化 http pastebin com 37zUkaA4 为了清楚起见 我决定只在图表上绘制每个月的 abline 我的代码如下 OxTemp Month lt facto
  • 如何删除 sed 中第一个模式后面的空格

    我有一个文件 file txt Name 6 1 4 Float Time 453802 464204 466345 464481 466131 464283 465065 462561 Name 6 1 4 Logic Good Time
  • 在 Outlook 中触发外部 API 调用,回复来自特定电子邮件 ID 的电子邮件

    当我回复来自特定发件人的电子邮件时 我尝试触发外部 API 为了描述用例 我们有一个内部平台 人们可以在其中提出具体问题 专家会回答这些问题 类似于堆栈溢出 我们希望为专家回答问题启用 Outlook 功能 这将使专家能够回复电子邮件通知
  • 使用信号和 sigpipe

    我正在做一项作业 涉及编写一个程序来使用 fork 进程 信号和选择来处理数据 计算 pi 我现在正在处理信号 我想我想做的是使用 SIGPIPE 因此如果程序捕获它 它会尝试再次写入管道 如果进程尝试写入没有读取器的管道 将会发送 SIG
  • 指定用作参考时区的时区

    根据前两个答案 问题与最初发布的一样不清楚 因此我完全重写它 以下问题仅涉及如何存储数据以及存储什么数据 而与检索时转换数据的形状或形式无关 因此 在 SELECT 处转换为所需的时区并不是一个合适的答案 将值插入到带有时区的时间戳字段时
  • Android - 清除导航 Backstack

    我有4页 从第 1 页 gt 第 2 页 gt 第 3 页 gt 第 4 页 用户到达 page 3 并单击按钮后 就会导航到 page 4 单击按钮后 我想清除所有导航历史记录 以便当用户返回 page 4 时 应用程序退出而不是返回 p
  • 尝试连接到 Google API 的 Google Oauth 时 JWT 无效

    我试图通过 JWT 通过 OAuth 连接到 Google API 但我不断收到此错误 error invalid grant error description 无效的 JWT 令牌必须是短期令牌且处于合理的时间范围内 在我的 JWT c
  • 在包含 DOS-cmd 的变量中使用 subprocess()

    我不太擅长编程并且在使用时遇到问题subprocess Python 中的命令 我的程序创建以下字符串 wsl ocrmypdf sr l deu mnt z dms inbox Scan 2019 11 27 13 12 33 pdf z
  • 在 Bash 布尔表达式中使用变量

    有人可以解释如何执行布尔运算并将它们存储在 Bash 中的变量中吗 I tried A true B false C A D A B echo C echo D 我也尝试过不用美元 用 用 如何在bash中完成如此简单的操作 控制台的结果是
  • 如何在ViewPager中设置OnClickListener

    我是 Android 开发新手 正在学习编写和设计 Android 项目 我有问题ViewPager并且无法在此网站上或通过 Google 搜索找到答案 Problem 我无法制作一个Button执行其动作ViewPager 您可以在这里查
  • Java JTable 标头自动换行

    我正在尝试让表格上的标题自动换行 我已经成功做到了这一点 但第一个数据行正在扩展 该表的代码是 public class GenerateTable extends JTable private JCheckBox boxSelect ne
  • 符号扩展 1 位 2 的补数?

    我是一名学生 正在用 C 语言编写一个函数来对给定的位字段进行符号扩展 我正在使用 32 位 我在谷歌上查找了这个答案 但没有找到我想要的东西 我正在编写一个函数 该函数返回从 32 英寸中提取的一个或多个连续位的二进制补码表示形式 最左边
  • jQuery:用方括号发布数组怪癖

    我正在使用以下代码来发帖 var checked 2231 2432 jQuery ajax type post url statusUrl data entries checked 然而 当它实际发布时 服务器端的发布数据和开发人员工具中
  • 无法在 Eclipse 中启动 IBM MobileFirst Foundation Studio 8.0

    操作系统版本 Mac OS Sierra 10 12 3 Eclipse 版本 Neon 3 发布 4 6 3 Steps 下载最新的 Eclipse 版本 为 Java 开发人员安装了 IDE 从 Eclipse Marketplace
  • 如何从循环中的原始资源读取多个文件?

    我有很多文本文件 想将它们放入 for 循环中 我得到了一个 Extra 其中包含上次活动的资源名称 并有一个资源名称为的数组 我的原始资源中的文本文件来自 d0 d1 d2 d3 d79 我想检查名称和数组名称并将查找名称放入资源 我在
  • 如何在docker compose启动时创建表postgresql

    我知道这个问题已经被问过并且也给出了答案 但这对我不起作用 我也遵循同样的做法 我的 postgres 容器运行良好 我在容器内部检查了 docker entrypoint initdb d init sql 是否存在 我使用了以下 doc
  • 如何使用 Junit 5 测试服务提供商实现模块?

    这是我的基本模块 需要实现 myspi 包中定义的接口 各种提供商都可以提供 MyProvider 实现 基础模块通过 myspi MyProvider 接口实现使用它们 module base exports myspi uses mys