2017-06-14 42 views
1

我目前正在開發一個Scala項目,並且遇到了測試使用Singleton對象的代碼時遇到的困難。用類替換單例是否存在任何潛在的問題?

我單身是這樣的:

object SomeSingleton { 
    def someFunction(s: String): String = s + "b" 
} 

而且某處一個項目,我有它在的方法使用我想測試:

val s = SomeSingleton.someFunction("a") 

我開發新的功能,我想SomeSingleton.someFunction到在沒有真正的方法調用的情況下返回測試中的某個特定值,我使用Powermock在Java中執行了此操作,但是我沒有找到在Scala中執行此操作的方法。 我有一個想法,我怎麼還這樣做,但它意味着改變原有的代碼如下:

object SomeSingleton extends SomeSingletonClass{} 

class SomeSingletonClass { 
    // Whole logic from SomeSingleton moves here 
    def someFunction(s: String): String = s + "b" 
} 

現在我可以SomeSingletonClass取代SomeSingleton使用和妥善嘲笑它。所以這裏是我的擔憂,這個項目並不小,它不是100%的測試覆蓋率,我對Scala來說是比較新的,所以我不確定它會帶來什麼壞結果?這是一個可行的解決方案嗎?因爲這個原因,我不希望我的遺留代碼在某個隨機位置中斷。

+0

這是很好... – OlivierBlanvillain

回答

1

鑑於你有什麼(遺留代碼與大量的單身人士),我認爲你的解決方案可能是好的。我想在此分享我的一些想法。

  1. 是,引入SomeSingletonClass類將幫助嘲諷類,但該缺點是,它不再是一個單例。我可以很容易地做val newSingleton = new SomeSingletonClass(),瞧,我已經創建了一個新的對象。測試單例的最好方法是,直接測試單例。我猜你的單身人士會調用更多的其他單身人士,並且你不想執行所有這些副作用。但要妥善解決問題,您需要廣泛重構代碼。

  2. PowerMock是一個非常強大的Java嘲笑工具(可能功率太大)。它可以模擬你的靜態方法/單例的方式是修改字節碼。它在大多數情況下都可以使用,但是當它不能使用時,您完全不知道如何解決它。在我以前在亞馬遜的工作中,我們廣泛使用PowerMock,但後來因爲黑盒魔術而慢慢遠離它。幫助我們實現的一種方式是使用依賴注入,並且可以輕鬆地在測試中注入模擬對象。

  3. 我可以看到您正在處理遺留代碼,因此重寫所有內容並不容易(例如引入依賴注入,或者甚至是您在此嘗試的新的SomeSingletonClass)。我的建議是,你可能不應該花太多時間爲遺留代碼編寫測試。相反,在編寫新代碼時,儘量使其可測試,並按照您認爲合適的方式重構遺留代碼。

+0

「_My的建議是,你可能不應該花太多的時間用於遺留代碼編寫測試。相反,編寫新的代碼時,儘量做到可測,並重構遺留代碼正如你所看到的那樣。「嗯,這正是我打算做的事情,這不是重寫遺留代碼,而是關於測試新代碼的能力。 – MaxNevermind

+0

如果沒有其他人,我會接受你的答案。 – MaxNevermind

+0

很高興我能幫忙:) –

相關問題