JUnit5-Jupiter:组合(=“元”)注释无法解析为注释定义

2024-01-03

我定义了自己的 JUnit 注释:

@ParameterizedTest
@MethodSource("myorg.qa.ccrtesting.DataProviders#standardDataProvider")
@Tags({@Tag("ccr"), @Tag("standard")})
public @interface CcrStandardTest {
}

然后,我可以在测试中使用该注释:

@CcrStandardTest
public void E0010_contact_standard (String testData) {
...
  • 我的运行配置:
    JVM 选项:-ea
    Class: myorg.qa.ccrtesting.ccrstandardtests.CcrStanConTest- 这是 IDE 建议的(并已验证指向正确的类,其中包含我的原型测试方法)

然而,这会导致:jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [java.lang.String arg0] in method [public void...

  • 我尝试删除String testData来自测试方法签名,但 JUnit 不执行任何测试:No tests found

  • 当我添加@Test在我的原型测试方法之上,它执行但是:

    1. 似乎没有我定义的注释@CcrStandardTest已应用
    2. IDE建议suspicious combination @Test and parameterized source
      (我已经知道@ParameterizedTest暗示@Test,只是不确定为什么 IDE 能够找到自定义注释,而 JUnit 却不能?)

正如您所发现的,您需要添加@Retention(RUNTIME) https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/annotation/Retention.html添加到您撰写的注释中,以便 JUnit 能够看到它。 Java 中的注解具有三种不同的保留策略:

  • RetentionPolicy.SOURCE https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/annotation/RetentionPolicy.html#SOURCE

    注释将被编译器丢弃。

  • RetentionPolicy.CLASS https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/annotation/RetentionPolicy.html#CLASS

    注释将由编译器记录在类文件中,但不需要由虚拟机在运行时保留。这是默认行为。 [已添加强调]

  • RetentionPolicy.RUNTIME https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/annotation/RetentionPolicy.html#RUNTIME

    注解将由编译器记录在类文件中,并在运行时由VM保留,因此可以反射性地读取它们。

正如我上面强调的,如果你不明确添加@Retention(...)那么CLASS使用策略。这不适用于 JUnit,因为 JUnit 不会扫描*.class文件(即字节码)的注释,它扫描loaded反思类来寻找测试方法。没有RUNTIME保留策略 您的注释不可反射访问,因此 JUnit 永远不会看到它,因此不会执行测试。

The @Target https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/annotation/Target.html注解:

指示注释类型适用的上下文。注释类型可能适用的声明上下文和类型上下文在 JLS 9.6.4.1 中指定,并在源代码中由以下枚举常量表示java.lang.annotation.ElementType https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/annotation/ElementType.html.

If an @Target注释类型上不存在元注释T,然后是类型的注释T可以写为除类型参数声明之外的任何声明的修饰符。

If an @Target存在元注释,编译器将强制执行由ElementType枚举常量,符合 JLS 9.7.4。

在我的回答中你的另一个问题 https://stackoverflow.com/q/60324735/6395627 I used:

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})

因为这与@ParameterizedTest https://junit.org/junit5/docs/current/api/org.junit.jupiter.params/org/junit/jupiter/params/ParameterizedTest.html。我认为将其限制为一个好主意METHOD自从设计师@ParameterizedTest显然认为只有方法应该通过参数化测试扩展直接扩展(参见§5 扩展模型 https://junit.org/junit5/docs/current/user-guide/#extensions)。并包括ANNOTATION_TYPE允许您将组合注释放置在另一个注释上,从而创建另一个组合注释。

你还会看到我包括在内@Documented https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/annotation/Documented.html:

如果注释@Documented出现在注释类型的声明中A,那么任意@A元素上的注释被视为元素公共契约的一部分。更详细地说,当注释类型A注释为Documented、类型注释的存在和值A是要素公共契约的一部分A注释。相反,如果注释类型B没有注释为Documented,存在和价值B注释不是元素公共契约的一部分B注释。具体来说,如果注释类型注释为Documented,默认情况下,像 javadoc 这样的工具将在其输出中显示该类型的注释,而没有注释类型的注释Documented将不会显示。

请注意这些注释——@Retention, @Target, and @Documented——不特定于 JUnit。这些注释对于 Java 中注释的工作方式至关重要,并且每个注释都位于java.lang.annotation包裹。

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

JUnit5-Jupiter:组合(=“元”)注释无法解析为注释定义 的相关文章

  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 使用 Ant 将非代码资源添加到 jar 文件

    我正在将 java 应用程序打包成 jar 文件 我正在使用 ant 和 eclipse 我实际上需要在 jar 中直接在根文件夹下包含几个单独的非代码文件 xml 和 txt 文件 而不是与代码位于同一位置 我正在尝试使用includes
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了

随机推荐

  • 使用纹理贴图对球体进行凹凸贴图

    我们想用纹理贴图对球体进行凹凸贴图 然而 表面 球体的面积是纹理贴图面积的 10 倍 两者的面积均以像素为单位 描述纹理贴图用于凹凸贴图的不同方式 通常矩形纹理用于球体 texture u v 坐标用作球坐标的角度 结果是 纹素在赤道附近较
  • EF6 中的急切加载、延迟加载和显式加载

    我读过这个tutorial http www entityframeworktutorial net EntityFramework5 entity framework5 introduction aspx和这个article https
  • 仅当省略号处于活动状态时才显示工具提示

    我有下一个 div div class div class style width 158px title 如何仅在省略号处于活动状态时显示工具提示 我发现这个功能 function isEllipsisActive e return e
  • 我可以记住通用方法吗?

    我有 2 个昂贵的通用方法 public T DoStuff
  • 在Python Pillow中设置图像分辨率

    我正在使用 Python Pillow 来修改图像 每当我保存 jpeg 时 内部分辨率都会设置为 72dpi 我想看看如何将其设置为不同的值 我意识到这只是一个数字 在很多方面它毫无意义 我的动机是当我将图像读入 Photoshop 时使
  • 想要在用户单击完成后调用presentingViewController中的方法

    新手 iOS 开发人员在这里使用了一款 iOS 应用程序 我有一个 iOS 应用程序的设置部分 当用户单击 完成 时 我需要模式视图控制器 目前是这样 并且我想在presentingViewController 中调用一个名为 update
  • Swift 4 中的文本到语音转换

    我正在尝试将文本到语音功能集成到我的 iOS 应用程序中 为此我正在使用AVSpeechUtterance and AVSpeechSynthesisVoice类的AVFoundation框架 extension String func s
  • Factory_girl 瞬态属性是什么?我为什么要使用一个?

    I read this https github com thoughtbot factory girl blob master GETTING STARTED md transient attributes来自 Thoughtbot 但它
  • kafka作为微服务中的消息总线可靠吗

    我使用 kafka 作为微服务架构的消息总线 因此多个服务监听一个主题的消息 因此 服务的上线高度依赖于主题 但是 有很多情况我得到leader not available broker not available and leader 1
  • C# 中 Excel 2016 的 oledb 连接字符串

    我一直在尝试使用 C 访问 2016 MS Excel 文件 但连接字符串只能在 2013 MS Excel 之前工作 我当前的连接字符串 提供程序 Microsoft ACE OLEDB 12 0 数据源 c myFolder myExc
  • 如何让 Solr 的拼写检查器忽略大小写?

    如何要求示例拼写检查器忽略大小写 我正在使用中显示的所有默认值demo http wiki apache org solr SpellCheckComponent Spell Checking Analysis 现在我看到如果我输入Anci
  • 如何轻松获取您正在处理的文件的网络路径?

    在 Excel 2003 中 我曾经在工具栏中添加了一个名为 地址 的命令 如果我没记错的话 它将显示我打开的文件的完全限定网络路径 例如 ads IT DEPT DFS data Users someguy somefile xls 当您
  • python 中不同级别的日志记录

    我想做一些我认为很简单的事情 实际上 对于 python 日志记录模块 我对日志记录感兴趣 命令行上的所有内容均处于命令给出的级别 行参数 并以固定的 DEBUG 级别记录到文件 创建两个具有不同级别的不同记录器不起作用 但是 设置添加到根
  • “违反主键约束‘PK_Vehicle_Transactions’。无法在对象‘dbo.Vehicle_Transactions’中插入重复的键”

    我设计了 Webservice api 每次我通过 webservice 推送数据时 这就是我得到的回报 MOV 违反主键约束 PK Vehicle Transactions 无法在对象 dbo Vehicle Transactions 中
  • “RTextTools”create_matrix 出现错误

    我正在运行 RTextTools 包来构建文本分类模型 当我准备预测数据集并尝试将其转换为矩阵时 我收到错误如下 Error in if attr weighting Acronym tf idf weight lt 1e 09 argum
  • 使用 yum 在 Amazon Linux 2 中安装 .NET Core

    我找不到在 AWS Linux 2 AMI 上安装 dotnet 2 2 的直接方法 有一些公告称安装了预构建的 AMI 但我看到的也有不同版本的 MSSQL Server 有没有办法使用 yum 安装 dotnet core 2 2 或在
  • 完全禁用 IPython 输出缓存

    我正在 IPython 中处理一些 GB 大小的 numpy 数组 当我删除它们时 我肯定希望它们消失 以恢复记忆 IPython 的输出缓存在那里非常烦人 因为即使删除了最后一个对象 它仍然使对象保持活动状态 积极意图参考他们 我已经设置
  • 为什么受保护的方法不可见?

    Java 专家 我真诚地感谢任何见解 我的包中有一个带有受保护方法的抽象类 我在同一个包中还有这个类的子类 现在 当我尝试从包外部的类实例化子类 并在子类实例上调用受保护的方法时 Eclipse 抱怨受保护的方法不可见 我认为 受保护的方法
  • 获取 Heroku dynos 的 IP

    我有一个 Heroku 应用程序对外部服务进行一些 API 调用 存在一些问题 服务想要知道哪些 IP 正在发出呼叫 很多基本工具 例如ifconfig traceroute netstat等不存在于机器上 看起来他们正在运行一个非常准系统
  • JUnit5-Jupiter:组合(=“元”)注释无法解析为注释定义

    我定义了自己的 JUnit 注释 ParameterizedTest MethodSource myorg qa ccrtesting DataProviders standardDataProvider Tags Tag ccr Tag