确保具有特定注释的字段是 '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>
我们代码中很常见的错误是写
@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>