确保具有特定注释的字段是 'private'

Ensure that fields with specific annotations are 'private'

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

@Mock Object object;
@InjectMocks Subject subject;

而不是

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

这可以防止 PMD/FindBugs/IntelliJ 在该字段未使用时发出警告,而且我们的代码审查中充斥着 "make this field private" 条评论。

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

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

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

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

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

您可以使用 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>