2016-01-22 39 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