全部,這裏是一個問題,我的搜索幾乎沒有深入瞭解。我認爲這對於我們所有人開發的大數據框架應該是一個相當普遍的問題,但也要求100%的測試覆蓋率。所以我會在這裏發佈這個問題,試圖收集最好的社區迴應&的想法。Scala/Spark中的靜態方法和構造函數攔截嘲諷
考慮場景,我們需要模擬的是實例化一個外部API對象
class SolrClientWrapper {
def doWork() = {
val cli = new CloudSolrClient("zkHost1")
???
}
}
得到100%的測試覆蓋率的一類,並沒有真正依靠Solr的服務器上,以單位期間一直達測試,我們將有一種方法來攔截對new CloudSolrClient
的呼叫。據我所知,唯一可用的庫PowerMock
這裏是扭曲 PowerMock和其他模擬庫需要asm
的依賴,而是一個複雜的框架星火項目還需要asm
。有版本衝突,因此(測試)運行時間地獄。
什麼是這種情況下最好的設計重構/庫?
我絕對同意,依賴注入是使用正確的模式。但是,如何在火花崗位的背景下推薦?例如,傳統的spark工作需要從main創建spark上下文等。 – echen
使用實際上下文有什麼問題?您可以在「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
這是一個好點,我將不得不進一步探索這些。它確實導致對框架概念/應用程序邏輯和第三方源/匯提供程序的架構和依賴關係圖進行一些反思。 – echen