2016-08-14 70 views
1

全部,這裏是一個問題,我的搜索幾乎沒有深入瞭解。我認爲這對於我們所有人開發的大數據框架應該是一個相當普遍的問題,但也要求100%的測試覆蓋率。所以我會在這裏發佈這個問題,試圖收集最好的社區迴應&的想法。Scala/Spark中的靜態方法和構造函數攔截嘲諷

考慮場景,我們需要模擬的是實例化一個外部API對象

class SolrClientWrapper { 
    def doWork() = { 
     val cli = new CloudSolrClient("zkHost1") 
     ??? 
    } 
} 

得到100%的測試覆蓋率的一類,並沒有真正依靠Solr的服務器上,以單位期間一直達測試,我們將有一種方法來攔截對new CloudSolrClient的呼叫。據我所知,唯一可用的庫PowerMock

這裏是扭曲 PowerMock和其他模擬庫需要asm的依賴,而是一個複雜的框架星火項目還需要asm。有版本衝突,因此(測試)運行時間地獄。

什麼是這種情況下最好的設計重構/庫?

回答

1

而不是在SolrClientWrapper類中創建一個新的CloudSolrClient對象,它應該作爲依賴項傳遞。然後在你的測試中,你可以傳遞一個模擬而不是真實的對象。請注意,有許多依賴注入框架和機制可以讓您更輕鬆地管理依賴關係(例如自動實例化它們並傳遞給構造函數)。

不知道asm是什麼,但是一旦你刪除了在類體內實例化代碼的部分代碼(因此需要「攔截」任何東西),你發佈的代碼應該很容易測試,而且沒有這種依賴關係。

+0

我絕對同意,依賴注入是使用正確的模式。但是,如何在火花崗位的背景下推薦?例如,傳統的spark工作需要從main創建spark上下文等。 – echen

+0

使用實際上下文有什麼問題?您可以在「before」塊中創建spark上下文,並在測試中使用它。這很好,因爲你不需要攔截任何東西。見[this](http://mkuthan.github.io/blog/2015/03/01/spark-unit-testing/)或[this](http://blog.cloudera.com/blog/2015/09 /製造-Apache的火花測試 - 易於與火花測試基/)。但是對於你的'CloudSolrClient',你應該將它用作依賴項。 – slouc

+0

這是一個好點,我將不得不進一步探索這些。它確實導致對框架概念/應用程序邏輯和第三方源/匯提供程序的架構和依賴關係圖進行一些反思。 – echen