Игнорировать правило PMD для методов с аннотацией теста - PullRequest
0 голосов
/ 28 июня 2018

Я использую PMD для проекта Spring Boot, который содержит MockMvc тестов. Класс заставляет пользователя ловить общий Exception.

class MockMvc {
    public ResultActions perform(RequestBuilder requestBuilder) throws Exception {}
}

Использование приводит к ошибке PMD - SignatureDeclareThrowsException . Я хотел бы отменить проверку для всех @Test методов. Поэтому я попытался выполнить ответ Stackoverflow , но изменение конфигурации не дало результата.

<rule ref="rulesets/java/strictexception.xml/SignatureDeclareThrowsException" >
    <properties>
        <!-- Ignore @Test methods -->
        <property name="violationSuppressXPath" value="
        //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='Test']" />
    </properties>
</rule>

Как я мог этого достичь?


Абстрактное синтаксическое дерево показывает следующее поддерево для метода тестирования.

> ClassOrInterfaceBodyDeclaration
  > Annotation
    > MarkerAnnotation
      > Name:Test
  > MethodDeclaration:(public)
    > ResultType:(void)
    ...

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Конкретную проблему с методами тестирования можно решить в версии со свойством IgnoreJUnitCompletely.

<!-- PMD > version 6.* -->
<rule ref="category/java/design.xml/SignatureDeclareThrowsException" >
    <properties>
        <property name="IgnoreJUnitCompletely" value="true" />
    </properties>
</rule>

До PMD 6 вы должны принять правило от typeresolution.xml, но не strictexception.xml.

<!-- PMD > version 4.* -->
<rule ref="rulesets/java/typeresolution.xml/SignatureDeclareThrowsException">
    <properties>
        <property name="IgnoreJUnitCompletely" value="true" />
    </properties>
</rule>

Но это не отвечает на вопрос о проблеме violationSuppressXPath.

0 голосов
/ 28 июня 2018

Из документации PMD , часть JUnit4TestShouldUseTestAnnotation

//ClassOrInterfaceDeclaration[
   matches(@Image, $testClassPattern)
    or ExtendsList/ClassOrInterfaceType[pmd-java:typeIs('junit.framework.TestCase')]]

/ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration[MethodDeclaration[@Public=true()]/MethodDeclarator[starts-with(@Image, 'test')]]
[not(Annotation//Name[pmd-java:typeIs('org.junit.Test')])]

Предположим, что Annotation//Name[pmd-java:typeIs('org.junit.Test')] должно быть достаточно

...