我的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 特定规则需要什么?
我不认为这是一个错误,你的违规SuppressXPath只是一直返回true。请记住,它是使用违规节点作为表达式的上下文节点进行评估的。
//ClassOrInterfaceDeclaration
//
XPath 表达式的开头选择文档根目录的所有后代,以便选择文件中的所有节点。因此,//ClassOrInterfaceDeclaration
选择文件中该类型的所有节点,而不一定是包含冲突节点的节点。
['.*PrincipalRepository']
此谓词始终为真,因为任何非空字符串都是真字符串。像['foo']
这样的谓词是通过使用boolean
函数将字符串转换为布尔值来计算的,如果字符串不为空,则会产生true()
。(这里的意思是测试类的名称,在属性@Image
)
所以基本上谓词不测试任何东西。其效果是,只要发现违规的文件包含一些ClassOrInterfaceDeclaration,您的violationSuppressXPath
就会禁止违规,这种情况非常频繁。
要完成这项工作,您可以将其替换为
./ancestor::ClassOrInterfaceDeclaration[@Image = 'PrincipalRepository']
请注意,不幸的是,XPath 1.0 不支持正则表达式,因此您无法进行正则表达式测试(尽管您可以使用contains
或模仿ends-with
,如本答案所示)。在这种情况下,我认为像您这样的@SuppressWarnings("PMD.MethodNamingConventions")
更合适。