Пользовательское эхолотное правило для проверки параметров аннотации - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть задача создать собственное правило, используя 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() {
    }
}

Вопрос:

-Можно ли получить параметры аннотации (правильно или в виде строки)?

-Есть ли другой возможный способ получить этот параметр

1 Ответ

0 голосов
/ 12 декабря 2018

Я понял это.Я перешел на использование 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;
}
...