【问题标题】:PMD custom junit method naming rule not workingPMD自定义junit方法命名规则不起作用
【发布时间】:2019-06-12 05:20:01
【问题描述】:

我在我的 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特定规则需要什么?

【问题讨论】:

    标签: java pmd


    【解决方案1】:

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

    //ClassOrInterfaceDeclaration
    

    // 在 XPath 表达式的开头选择文档根目录的所有后代,因此是文件中的所有节点。所以//ClassOrInterfaceDeclaration 会选择文件中该类型的所有节点,而不一定是包含违规节点的节点。

    ['.*PrincipalRepository']
    

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

    所以基本上谓词不测试任何东西。效果是,只要发现违规的文件在任何地方包含 some ClassOrInterfaceDeclaration,您的 violationSuppressXPath 就会抑制违规,这种情况非常频繁。

    要完成这项工作,您可以将其替换为

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

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

    【讨论】:

    • PMD 为 XPath 1.0 提供了一个自己的 matches 函数来支持正则表达式:./ancestor::ClassOrInterfaceDeclaration[matches(@Image, '^.*PrincipalRepository$')]
    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    相关资源
    最近更新 更多