我有一個單元測試課,當它單獨通過時。當我將其與包中的所有其他測試一起運行時,失敗的原因是獨立靜態類尚未初始化。這個獨立的靜態類被其他類使用,因此似乎它的狀態在測試之間保持不變。JUnit - 靜態類在測試類之間保持狀態嗎?
我的觀察是正確的還是其他事情發生?如果有人能夠提供鏈接或其他內容作爲參考,這也會很好。
謝謝!
我有一個單元測試課,當它單獨通過時。當我將其與包中的所有其他測試一起運行時,失敗的原因是獨立靜態類尚未初始化。這個獨立的靜態類被其他類使用,因此似乎它的狀態在測試之間保持不變。JUnit - 靜態類在測試類之間保持狀態嗎?
我的觀察是正確的還是其他事情發生?如果有人能夠提供鏈接或其他內容作爲參考,這也會很好。
謝謝!
這個獨立的靜態類被其他類使用,所以它的狀態似乎在測試之間保持不變。
是。那將會發生什麼。這只是靜力學尷尬的原因之一。
靜態字段在定義它們的類的生命週期中存在,這通常表示JVM的生命週期。我試圖在JLS中找到一個明確陳述的地方。我能找到的最接近的是JLS 8.3.1.1它說:
「如果一個字段被聲明爲靜態,存在的領域,只有一個化身無論有多少類的實例(可能是零)最終可能會被創建。當類被初始化時(§12.4),一個靜態字段,有時稱爲類變量。
其他地方,JLS說,一個類只有一次初始化。
這是一個例外,當一個類被卸載,但這不會發生在這裏。或者至少,沒有正常的/默認的JUnit框架行爲。 (但可以這樣做:請參見Using different classloaders for different JUnit tests?)
如果您擔心,沒有任何JUnit「魔術」可以將靜態重置爲初始狀態(但您定義了該狀態)。考慮實施這一點太複雜(也很可怕)。
方法沒有狀態,所以沒有被保存調用—之間甚至static
方法。(同時給定方法運行,當然除外),
任何static
領域保存其狀態的JVM的持續時間執行(除非代碼改變了它的值,當然)。 JUnit爲其所有測試使用一個JVM,因此,static
字段在測試之間保存狀態。
這是人們推薦不使用static
字段的最大原因之一,它可以避免它們:它減少了您不必擔心的全局狀態量,從而使得更容易推理測試。
靜態類是什麼意思? –
本質上是一個具有靜態成員變量和方法的類。這個類用於保存整個應用程序的配置信息。 – n00b