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



我的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")更合适。

最新更新