如何用Java获取JUnit5自定义标签@TestCaseDetails的属性值
问题根因
你当前无法获取注解属性的核心问题有2个:
- 注解属性名不匹配:你自定义
@TestCaseDetails注解中定义的属性名为Id,但测试方法上标注该注解时使用了testcaseId="1234",二者名称不统一会导致编译/取值异常 - 反射方法使用错误:
Class.getMethod()和Class.getMethods()只能获取类的public修饰的方法,你的测试方法multipleTags是默认包访问权限,没有public修饰,因此无法匹配到对应方法,会抛出NoSuchMethodException
修复方案
步骤1:统一注解属性名
保持注解定义和使用时的属性名一致,我们这里直接修改测试方法上的注解配置,和你预先定义的Id属性对齐:
@Test @Tags(value ={@Tag("TT"), @Tag("MM")}) // 把testcaseId改为Id,和注解定义的属性名匹配 @TestCaseDetails(Id="1234") @MongoDataSet(value = "/dataset/SampleTestData.json", cleanAfter = true, cleanBefore = true) void multipleTags() throws Exception { // 测试方法逻辑 }
步骤2:修改反射取值逻辑
把getMethod替换为getDeclaredMethod,如果要遍历所有方法,就把getMethods替换为getDeclaredMethods,如下是修复后的取值代码:
class JUnit5ExampleTest { @Test @Tags(value ={@Tag("TT"), @Tag("MM")}) @TestCaseDetails(Id="1234") @MongoDataSet(value = "/dataset/SampleTestData.json", cleanAfter = true, cleanBefore = true) void multipleTags() throws Exception { System.out.println("*******************JUnit5ExampleTest********************************"); // 优化后的方案:直接获取当前方法的注解 Method currentMethod = this.getClass().getDeclaredMethod("multipleTags"); TestCaseDetails anno = currentMethod.getAnnotation(TestCaseDetails.class); // 输出Id属性值1234 System.out.println(anno.Id()); } }
补充说明
如果你的测试方法本身就是public修饰的,那用原来的getMethod也可以正常工作,但getDeclaredMethod兼容性更强,不受方法访问权限限制。
内容的提问来源于stack exchange,提问作者SeleniumUser
相关产品推荐
相关产品推荐

