在 Java 中参数化@Interface注释



我有一个这样的@interface注释类型-

public @interface someAnnotation {
String someVar() default "var_value";
}

我想在类似于这个的 Junit5 测试上参数化someVar

@ParametrizedTest
@ValueSource(strings = {"val1","val2"})
@someAnnotation(someVar = ??)
void theTestMethod(String s){
//test something
}

我希望将s的值(由valueSource提供)加载到someVar。显然这样的事情是行不通的——

@someAnnotation(someVar = s)

我还尝试通过实现BeforeEachCallback来使用测试扩展来获取可以访问某些 Var 的ExtensionContext,但我发现无法从ExtensionContext获取 ValueSource 值或方法参数值。有什么办法可以做到这一点吗?

Java 语言规范中关于注释的部分简单地说,元素值不能null,只能是:

  • 常量表达式
  • 类文本
  • 枚举常量
  • 元素
  • 为上述元素之一的数组

因此,您要求的内容是语言不允许的。

据我所知,在测试中实现注释值的这种可变性的唯一方法是让测试生成源代码并动态编译(或者,等效地,直接生成字节码)。

从风格上讲,我认为,除非你的@ValueSource有超过 ~50 个元素,否则读者只需写出每个情况会更简单、更清晰,例如:

@Test
@someAnnotation(someVar = "val1")
void theTestMethodVal1(){
theTestMethodHelper("val1");
}
@Test
@someAnnotation(someVar = "val2")
void theTestMethodVal2(){
theTestMethodHelper("val2");
}
void theTestMethodHelper(String s){
//test something
}

综上所述,我不清楚这样的测试的目标可能是什么。

从上述方法主体中对"val1""val2"的硬编码可以清楚地看出,简单地在方法主体中内联所需的值会更清晰、更简洁,而不是跳过从方法上的注释中动态读取相同值所需的反射箍。

最新更新