正如您所发现的,您需要添加@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
包裹。