我正在尝试运行参数化的junit测试,其中参数在测试中必须是常量,所以我使用Reflection来设置该参数。但它不是很有效。在下面的示例中,它始终打印CellEditingTemplate
。我该如何解决这个问题?令人惊讶的是,我在调试器中为不同的运行实例获取了PARAM_NAME(param-1,param-2,param-2)的正确值,但它在控制台上始终作为“param-1”打印,并且在测试中也用作“param-1” ”。这可以部分解释为在编译时评估注释,因此在运行时不能更改注释中的值吗?
Testing with: param-1
答案 0 :(得分:0)
注释值由JVM缓存,并且您无法在运行时更改它。我能想到的唯一可能的方法是,您可以通过源代码生成(基于模板或使用像JCodeModel这样的库)以编程方式生成测试类。如果你在测试编译之前的生命周期阶段这样做(假设你使用像Maven或Gradle这样的构建系统),那么你应该相对容易地运行起来。
答案 1 :(得分:0)
我可以通过在运行时更改注释值来实现:
public static void changeAnnotationValue(Annotation annotation, String key, Object newValue) throws NoSuchFieldException, IllegalAccessException {
Object handler = Proxy.getInvocationHandler(annotation);
Field f = handler.getClass().getDeclaredField("memberValues");
f.setAccessible(true);
Map<String, Object> memberValues = (Map<String, Object>) f.get(handler);
memberValues.put(key,newValue);
}
我按以下方式调用此方法:
public SomeTest(String someParam){ changeAnnotationValue(SomeTest.class.getMethod("testSomething").getAnnotation(ExternalAnnotation.class), "value", someParam);}
虽然在主要代码中完全不建议,但可能会有副作用。我只是在测试课中这样做。