忽略带有Test注释的方法的PMD规则

6

我在一个包含MockMvc测试的Spring Boot项目中使用PMD。这个类强制用户捕获通用的Exception

class MockMvc {
    public ResultActions perform(RequestBuilder requestBuilder) throws Exception {}
}

使用会导致PMD错误 - SignatureDeclareThrowsException。我想要抑制所有@Test方法的检查。因此,我尝试遵循一个Stackoverflow答案,但配置更改没有效果。

<rule ref="rulesets/java/strictexception.xml/SignatureDeclareThrowsException" >
    <properties>
        <!-- Ignore @Test methods -->
        <property name="violationSuppressXPath" value="
        //ClassOrInterfaceBodyDeclaration/Annotation/MarkerAnnotation//Name[@Image='Test']" />
    </properties>
</rule>

请问我该如何实现它?


抽象语法树(AST)显示测试方法的以下子树。

> ClassOrInterfaceBodyDeclaration
  > Annotation
    > MarkerAnnotation
      > Name:Test
  > MethodDeclaration:(public)
    > ResultType:(void)
    ...

1
也许你可以尝试这种方式:https://dev59.com/ahL6s4cB2Jgan1zn-2B4 可能是重复的。虽然它很可能会排除整个类。 - hakamairi
2个回答

3
具体的测试方法问题可以在版本中通过 IgnoreJUnitCompletely 属性来解决。
<!-- PMD > version 6.* -->
<rule ref="category/java/design.xml/SignatureDeclareThrowsException" >
    <properties>
        <property name="IgnoreJUnitCompletely" value="true" />
    </properties>
</rule>

在使用PMD 6之前,您需要从typeresolution.xml而不是strictexception.xml获取规则。
<!-- PMD > version 4.* -->
<rule ref="rulesets/java/typeresolution.xml/SignatureDeclareThrowsException">
    <properties>
        <property name="IgnoreJUnitCompletely" value="true" />
    </properties>
</rule>

但这并没有回答关于 violationSuppressXPath 问题的疑问。


1
很棒的发现,已点赞。但是这个功能自4.0版本以来就存在了,应该可以在5.7.0版本中使用。https://pmd.github.io/pmd-5.7.0/xref/net/sourceforge/pmd/lang/java/typeresolution/rules/SignatureDeclareThrowsException.html,除非它需要最近6.2.0版本的修复。 - hakamairi
1
@hakamairi 谢谢。有两个SignatureDeclareThrowsException规则,分别在strictexceptiontyperesolution包中。你的建议只适用于第二个包。真是一团糟。;-) 我会更新我的答案。 - sschmeck

1
PMD文档 中,JUnit4TestShouldUseTestAnnotation 部分。
//ClassOrInterfaceDeclaration[
   matches(@Image, $testClassPattern)
    or ExtendsList/ClassOrInterfaceType[pmd-java:typeIs('junit.framework.TestCase')]]

/ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration[MethodDeclaration[@Public=true()]/MethodDeclarator[starts-with(@Image, 'test')]]
[not(Annotation//Name[pmd-java:typeIs('org.junit.Test')])]

建议使用Annotation//Name[pmd-java:typeIs('org.junit.Test')]即可。

无法工作,<property name="violationSuppressXPath" value="Annotation//Name[pmd-java:typeIs('org.junit.Test')]" /> - sschmeck
抱歉,伙计,我必须正确设置以本地测试此功能。你能否在 Github 或类似的平台上发布一个基础代码来帮忙吗? - hakamairi
您可以使用Spring示例,完成文件夹 - https://github.com/spring-guides/gs-testing-web。 - sschmeck
1
//MethodDeclaration/../Annotation/MarkerAnnotation/Name[@Image='Test'] 对我很有效。 - sschmeck
很高兴你找到了你想要的答案。一定要将其作为单独的被接受的答案。 - hakamairi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接