PMD自定义junit方法命名规则不起作用

时间:2019-05-06 09:30:24

标签: java pmd

我在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进行注释 触发junit特定规则需要什么?

1 个答案:

答案 0 :(得分:2)

我不认为这是一个错误,您的violationSuppressXPath始终会返回true。请记住,它是使用违反节点作为表达式的上下文节点进行评估的。

//ClassOrInterfaceDeclaration
在XPath表达式的开头

//选择文档根的所有后代 ,因此选择文件中的所有节点。因此,//ClassOrInterfaceDeclaration选择文件中该类型的所有节点,而不必选择包含违规节点的节点。

['.*PrincipalRepository']

此谓词始终为true,因为任何非空字符串都是真实的。通过使用['foo']函数将字符串转换为布尔值来评估像boolean这样的谓词,如果字符串非空,则产生true()。 (这是在属性@Image中测试类的名称)

因此,该谓词基本上不会测试任何内容。效果是,只要发现违规的文件在任何地方包含 some ClassOrInterfaceDeclaration的地方(非常频繁),您的violationSuppressXPath都会抑制该违规。

要使其正常工作,您可以将其替换为

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

请注意,不幸的是,XPath 1.0不支持正则表达式,因此您无法进行正则表达式测试(尽管您可以像在this answer中那样使用contains或模仿ends-with)。在这种情况下,我认为像您想出的@SuppressWarnings("PMD.MethodNamingConventions")更合适。