【问题标题】:Ensure that fields with specific annotations are 'private'确保具有特定注释的字段是“私有的”
【发布时间】:2015-11-29 07:24:32
【问题描述】:

我们的代码中很常见的错误是写

@Mock Object object;
@InjectMocks Subject subject;

而不是

@Mock private Object object;
@InjectMocks private Subject subject;

这可以防止 PMD/FindBugs/IntelliJ 在该字段未使用时发出警告,而且我们的代码审查因“将此字段设为私有”cmets 而变得臃肿。

当具有特定注释的字段没有预期的可见性时,任何工具中是否有任何静态分析规则来发出警告?

我找到了 Checkstyle 的 VisibilityModifier,但它标记了所有非私有字段,而不仅仅是带有特定注释的字段。

【问题讨论】:

  • 不会将此作为新答案发布,因为我无权访问它 - 这是一个商业工具。 Fortify 似乎同时支持 structuralXPath 查询。

标签: java intellij-idea static-analysis checkstyle pmd


【解决方案1】:

您可以在 IntelliJ IDEA 中使用 结构搜索检查。例如这样的模式:

@Mock @Modifier("packageLocal") $FieldType$ $FieldName$ = $Init$;

字段类型:最小值:1,最大值:1
字段名称:最小值:1,最大值:1
初始化:最小值:0,最大值:1

【讨论】:

  • 谢谢 - 你认为有可能在 Jenkins 上实现自动化,并且如果这种模式匹配,则构建失败并显示有意义的消息?
  • IntelliJ IDEA 有一个 inspect.sh 脚本,它是 bin 目录,可以用于这样的事情。您可能还需要某种 Jenkins 插件。抱歉,我帮不上忙,我自己从未使用过 Jenkins。
【解决方案2】:

您可以使用 PMD 的规则设计器创建一个新的 XPath 规则,该规则可以嵌入到 PMD 规则集 xml 文件中。我没有将 PMD 与 IntelliJ IDEA 或 Jenkins 一起使用,但我确信这些插件存在。

这是我制定的规则(未在规则设计器之外测试):

<rule  name="NonPrivateMockAnnotation"
  message="Mock anotation should be private"
  class="net.sourceforge.pmd.lang.rule.XPathRule">
  <description>
  </description>
  <properties>
    <property name="xpath">
    <value>
<![CDATA[
//ClassOrInterfaceBodyDeclaration[
    Annotation/MarkerAnnotation/Name[
        @Image = 'InjectMocks' or
        @Image = 'Mock' 
    ] and
    FieldDeclaration/@Private = 'false'
]
]]>
    </value>
    </property>
  </properties>
  <priority>3</priority>
  <example>
<![CDATA[
class Example {
  @Mock Object object;
  @InjectMocks Subject subject;
}
]]>
  </example>
</rule>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2017-03-14
  • 2017-01-29
  • 2012-03-22
  • 2015-04-25
相关资源
最近更新 更多