2016-01-22 41 views
2

Junit @Rulesmaven-checkstyle-plugin似乎彼此不一致。Junit @规则和Maven Checkstyle插件

如果@Ruleprivate或包私人那么结果是:

java.lang.Exception: The @Rule 'someRule' must be public. 
    at org.junit.internal.runners.rules.RuleFieldValidator.addError 

但是,如果@Rulepublic的CheckStyle的会抱怨:

[INFO] --- maven-checkstyle-plugin:2.15:checkstyle (checkstyle-test) @ web-edge-server --- 
[INFO] Starting audit... 
SomeTest.java: Variable 'someRule' must be private and have accessor methods. 

所以两个问题:

  1. 如果我想继续使用t他@Rule注解有什么办法可以在本地或在测试中抑制此警告,而无需全局禁用checkstyle规则。
  2. 有谁知道为什么junit要求@Rule公开?这似乎是不必要的,因为无论如何它都可以通过反射进行访问。

编辑:第2项具体由此SO question覆盖。

+0

对于2/HTTP:// stackoverflow.com/questions/14335558/why-rule-annotated-fields-in-junit-has-to-be-public – 2016-01-22 18:15:30

+0

For 1/http://stackoverflow.com/questions/4023185/how-to-disable-a - 特定行号 - 特定行号的规则(我使用这个关闭作为重复投票) – 2016-01-22 18:16:04

+0

你使用什么Checkstyle版本? –

回答

3

在Checkstyle的6.5 VisibilityModifier检查取得了新的属性ignoreAnnotationCanonicalNames这是默认设置为org.junit.Rule,所以@Rule字段不应触发此检查中的违规。

根据release history page,Checkstyle Maven Plugin 2.15在底下使用Checkstyle 6.1.1,所以它足以让更新插件到2.17来修复。

2

在你的CheckStyle XML,你可以按如下方式指定suppression filter

<module name="SuppressionFilter"> 
    <property name="file" value="${samedir}/suppressions.xml"/> 
</module> 

然后你就可以明确地排除测试,检查:

<?xml version="1.0"?> 

<!DOCTYPE suppressions PUBLIC 
"-//Puppy Crawl//DTD Suppressions 1.1//EN" 
"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd"> 

<suppressions> 
     <suppress checks="VisibilityModifier" files="[/\\]src[/\\]test[/\\]java[/\\]" /> 
</suppressions> 
0

,可以用来解决这个问题没有升级到插件的版本2.17是简单地使用注释来开启和关闭的CheckStyle的另一种选择:

//CHECKSTYLE:OFF 
@Rule 
public ExpectedException thrown = ExpectedException.none(); 
//CHECKSTYLE:ON