Правило именования пользовательских методов Junit PMD не работает - PullRequest
0 голосов
/ 06 мая 2019

В моем файле ruleSet.xml определено следующее правило:

<rule ref="category/java/codestyle.xml/MethodNamingConventions">
    <properties>
        <property name="junit4TestPattern" value="[a-z]*_[A-Z]{1}[a-z,A-Z]*_[A-Z]{1}[a-z,A-Z]*"/>
        <property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration['.*FoobarRepository']"/>
    </properties>
</rule>

Но при запуске PMD ничего не происходит, у меня есть много методов, которые не соответствуют шаблону именования методов junit4. Все методы аннотированы с помощью org.junit.Test Что нужно для запуска определенных правил джунта?

1 Ответ

2 голосов
/ 05 июня 2019

Я не думаю, что это ошибка, ваше нарушениеSuppressXPath просто возвращает true все время.Помните, что он оценивается с использованием узла-нарушителя в качестве узла контекста выражения.

//ClassOrInterfaceDeclaration

// в начале выражения XPath выбирают всех потомков корня документа , так что все узлы в файле.Таким образом, //ClassOrInterfaceDeclaration выбирает все узлы этого типа в файле, и не обязательно тот, который включает в себя узел нарушения.

['.*PrincipalRepository']

Этот предикат всегда верен, потому что любая непустая строка верна.Предикат, такой как ['foo'], вычисляется путем преобразования строки в логическое значение с помощью функции boolean, которая выдает true(), если строка не пустая.(Здесь вы хотите проверить имя класса в атрибуте @Image)

Так что в основном предикат ничего не проверяет.В результате ваш violationSuppressXPath подавляет нарушение в любое время, когда файл, в котором обнаружено нарушение, содержит некоторые ClassOrInterfaceDeclaration в любом месте, что довольно часто.

Чтобы сделать это, вы могли бызамените его на

./ancestor::ClassOrInterfaceDeclaration[@Image = 'PrincipalRepository']

Обратите внимание, что, к сожалению, XPath 1.0 не поддерживает регулярные выражения, поэтому вы не можете выполнить тест регулярного выражения (хотя вы можете использовать contains или имитировать ends-with, как в этот ответ ).В этом случае, я думаю, что @SuppressWarnings("PMD.MethodNamingConventions"), как вы придумали, более уместно.

...