【问题标题】:Custom sonar rule for annotation parameters check用于注释参数检查的自定义声纳规则
【发布时间】:2018-12-12 16:37:11
【问题描述】:

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

这是我准备的:

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() {
    }
}

问题:

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

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

【问题讨论】:

    标签: annotations sonarqube squid


    【解决方案1】:

    我想通了。我改用 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2019-04-22
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多