首页 > 解决方案 > 用于注释参数检查的自定义声纳规则

问题描述

我的任务是使用 SonarJava 创建自定义规则。规则的目的是检查方法。如果方法使用@Test 注释,则它还需要具有非空 testCaseId 参数的@TestInfo 注释。

这是我准备的:

public class AvoidEmptyTestCaseIdParameterRule extends IssuableSubscriptionVisitor {

private static final String TEST_ANNOTATION_PATH = "org.testng.annotations.Test";
private static final String TEST_INFO_ANNOTATION_PATH = "toolkit.utils.TestInfo";

@Override
public List<Tree.Kind> nodesToVisit() {
    return ImmutableList.of(Tree.Kind.METHOD);
}

@Override
public void visitNode(Tree tree) {
    MethodTree methodTree = (MethodTree) tree;

    if (methodTree.symbol().metadata().isAnnotatedWith(TEST_ANNOTATION_PATH)) {
        if (methodTree.symbol().metadata().isAnnotatedWith(TEST_INFO_ANNOTATION_PATH)) {
            List<AnnotationInstance> annotations = methodTree.symbol().metadata().annotations();
            for (int i = 0; i < annotations.size(); i++) {
                if (annotations.get(i).symbol().name().equals("TestInfo")
                        && !testInfoAnnotationContainsNonEmptyTestCaseIdParameter(annotations.get(i))) {
                    reportIssue(methodTree.simpleName(),
                            "Method annotated with @TestInfo should have not empty testCaseId parameter");
                }
            }
        } else {
            reportIssue(methodTree.simpleName(),
                    "Method annotated with @Test should also be annotated with @TestInfo");
        }

    }

}

private boolean testInfoAnnotationContainsNonEmptyTestCaseIdParameter(AnnotationInstance annotation) {

    return <--this is where I stuck-->;
}
}

这就是我的测试类的样子:

public class TestClass {
    @Test
    @TestInfo(testCaseId = "", component = "Policy.IndividualBenefits")
    public void testMethod() {
    }
}

问题:

- 是否可以获得注释参数(正确或作为字符串行)?

- 还有其他可能的方法来获取这个参数吗?

标签: annotationssonarqubesquid

解决方案


我想到了。我改用 Tree.Kind.ANNOTATION。这是搜索所需参数的代码:

Arguments arguments = annotationTree.arguments();
            if (!arguments.isEmpty()) {
                for (int i = 0; i < arguments.size(); i++) {
                    String parameter = arguments.get(i).firstToken().text();
                    String parameterValue = arguments.get(i).lastToken().text();
                    if (isParameterTestCaseId(parameter) && isTestCaseIdEmpty(parameterValue)) {
                        reportIssue(arguments.get(i),
                                "Method annotated with @TestInfo should have not empty testCaseId parameter");
                    }
                }
            }

检查参数及其值的方法:

private boolean isParameterTestCaseId(String parameter) {
    return parameter.matches("testCaseId");
}

private boolean isTestCaseIdEmpty(String parameterValue) {
    return parameterValue.length() != 0;
}

推荐阅读