2013-04-12 57 views
1

檢查很多XML字符串,我經常使用ErrorCollector構造。但我仍然不明白它是如何工作的。爲什麼ErrorCollector在聲明時需要分配?

當我宣佈一個ErrorCollector,我得馬上給它分配:

@Rule 
public ErrorCollector collector= new ErrorCollector(); 

如果我想刷新每次測試前的收藏家,我把分配

collector= new ErrorCollector(); 

在@Before方法。但是,宣言的第一項任務是過度的。但我無法刪除它。

這個必須分配的意義是什麼?它是如何工作的?我認爲,@規則只是關於聲明?

@Matthew Farwell What is the logic of @Rule(JUnit) declaration and assignment in a Groovy class說:「在Java中,JUnit runner檢查@Rule註釋是否應用於公共非靜態字段或公共非靜態方法,該方法返回TestRule或MethodRule。」但是,這裏檢查的不是聲明,而是指派,這是在建築和測試施工之後發生的事情?

+0

什麼是'test-construction',它爲什麼適用於這個問題,而'unit-testing'沒有? – Charles

回答

3

與JUnit中的大多數/全部@Rule s一樣,它們在每次測試前自動爲refreshedcleared。因此,您只需將其聲明爲@Rule就如上面所列。你不需要在你的@Before方法中做任何事情。我們認爲這是JUnit會在每次測試之前和之後調用ErrorCollector。在每次測試之前,ErrorCollector可以自行初始化(清除以前存儲的任何錯誤)。每次測試後,如果收集到錯誤,則會報告錯誤。

這裏是​​

來自備註來源:

必須分配,因爲JUnit的必須要有規則的情況下進行工作。否則,該對象將爲空。請記住,JUnit代碼使用反射來使用@Rule註釋獲取Object的實例,並使用instanceof來確定它是否是TestRule或MethodRule。我相信@Before方法在聲明內,因此該規則被調用

FROM MatthewFarwell後叫:

當您運行JUnit測試,例如,FooTest,那麼亞軍將創建FooTest實例爲每個測試方法。所以如果你使用公共ErrorCollector collector = new ErrorCollector();如上所述,那麼每個測試方法都會自然地重新實例化一次。

Conclusing:確保您在測試之間不保存狀態!當然,你不應該這樣做,因爲訂單不能保證。

謝謝馬特!

+0

「在每次測試之前,ErrorCollector可以自行初始化」1.因此,可以還是應該? 2.謝謝,並有+1,但我想了解該@Rule註釋的行爲。 – Gangnus

+0

1.你不應該在意。關鍵在於除了將其聲明爲@規則以外,您不必做任何事情。 2。JUnit使用'@ Rule'註釋來標識應該用於包裝每個測試方法的'TestRule'實例。 JUnit將每個測試的執行包裝在一個'Statement'中,然後爲每個找到的'Rule'提供'Statement',以便'Rule'用它自己的定製邏輯封裝語句。 –

+0

看來,我明白了,謝謝。但這並不能解釋爲什麼我要在聲明中使用賦值。我可以閱讀源代碼,這不是一個問題。但是我需要閱讀哪些源代碼 - 這就是問題所在。 – Gangnus

相關問題