【问题标题】:Ignore PMD rule for methods with a Test annotation忽略带有 Test 注释的方法的 PMD 规则
【发布时间】:2018-06-29 16:17:58
【问题描述】:

我将 PMD 用于包含 MockMvc 测试的 Spring Boot 项目。该类强制用户捕获一般Exception

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

使用会导致 PMD 错误 - SignatureDeclareThrowsException。我想禁止检查所有 @Test 方法。因此我尝试关注Stackoverflow answer,但配置更改无效。

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

我怎样才能实现它?


抽象语法树显示了测试方法的以下子树。

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

【问题讨论】:

标签: java junit abstract-syntax-tree pmd


【解决方案1】:

测试方法的具体问题可以在带有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 问题的问题。

【讨论】:

  • 很酷的发现,点赞。但是这个功能从 4.0 开始就存在,应该在 5.7.0 pmd.github.io/pmd-5.7.0/xref/net/sourceforge/pmd/lang/java/… 中工作,除非它需要最近的 6.2.0 修复之一。
  • @hakamairi 谢谢。有 2 个SignatureDeclareThrowsException 规则,包strictexceptiontyperesolution。您的建议仅适用于第二个包。真是一团糟。 ;-) 我会更新我的答案。
【解决方案2】:

来自PMD documentation,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')]应该够用了

【讨论】:

  • 不行,&lt;property name="violationSuppressXPath" value="Annotation//Name[pmd-java:typeIs('org.junit.Test')]" /&gt;
  • 对不起伙计,我必须正确设置才能在本地进行测试。您能在 github 或类似网站上发布一个样板吗?
  • 您可以使用 spring 示例,完整文件夹 - github.com/spring-guides/gs-testing-web
  • //MethodDeclaration/../Annotation/MarkerAnnotation/Name[@Image='Test'] 为我工作。
  • 很高兴您找到了您正在寻找的答案。请务必将其作为单独接受的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
相关资源
最近更新 更多