2014-03-27 64 views
7

我有一個單元測試課,當它單獨通過時。當我將其與包中的所有其他測試一起運行時,失敗的原因是獨立靜態類尚未初始化。這個獨立的靜態類被其他類使用,因此似乎它的狀態在測試之間保持不變。JUnit - 靜態類在測試類之間保持狀態嗎?

我的觀察是正確的還是其他事情發生?如果有人能夠提供鏈接或其他內容作爲參考,這也會很好。

謝謝!

+0

靜態類是什麼意思? –

+0

本質上是一個具有靜態成員變量和方法的類。這個類用於保存整個應用程序的配置信息。 – n00b

回答

5

這個獨立的靜態類被其他類使用,所以它的狀態似乎在測試之間保持不變。

是。那將會發生什麼。這只是靜力學尷尬的原因之一。

靜態字段在定義它們的類的生命週期中存在,這通常表示JVM的生命週期。我試圖在JLS中找到一個明確陳述的地方。我能找到的最接近的是JLS 8.3.1.1它說:

「如果一個字段被聲明爲靜態,存在的領域,只有一個化身無論有多少類的實例(可能是零)最終可能會被創建。當類被初始化時(§12.4),一個靜態字段,有時稱爲類變量。

其他地方,JLS說,一個類只有一次初始化。

這是一個例外,當一個類被卸載,但這不會發生在這裏。或者至少,沒有正常的/默認的JUnit框架行爲。 (但可以這樣做:請參見Using different classloaders for different JUnit tests?

如果您擔心,沒有任何JUnit「魔術」可以將靜態重置爲初始狀態(但您定義了該狀態)。考慮實施這一點太複雜(也很可怕)。

4

方法沒有狀態,所以沒有被保存調用—之間甚至static方法。(同時給定方法運行,當然除外),

任何static領域保存其狀態的JVM的持續時間執行(除非代碼改變了它的值,當然)。 JUnit爲其所有測試使用一個JVM,因此,static字段在測試之間保存狀態。

這是人們推薦不使用static字段的最大原因之一,它可以避免它們:它減少了您不必擔心的全局狀態量,從而使得更容易推理測試。