我在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特定规则需要什么?
答案 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")
更合适。