2014-01-17 19 views
7

試圖擴大Spock在工作中的吸引力並且遇到這個問題。實際上試圖爲Groovy類編寫單元測試,但是需要調用Java。一個靜態方法調用一個私有構造函數。代碼如下所示:Spock可以模擬一個Java構造函數

private MyConfigurator(String zkConnectionString){ 
    solrZkClient = new SolrZkClient(zkConnectionString, 30000, 30000, 
      new OnReconnect() { 
       @Override 
       public void command() { . . . } 
      }); 
} 

「SolrZkClient」來自第三方(Apache)Java庫。由於它試圖連接到ZooKeeper,我想嘲笑這個單元測試(而不是在內部作爲單元測試的一部分運行)。

我的測試變得毫無困難的構造,但我不能讓過去那個構造函數:

def 'my test'() { 
    when: 
     MyConfigurator.staticMethodName('hostName:2181') 
    then: 
     // assertions 
} 

反正有沒有做到這一點?

回答

8

由於被測試的類是使用Groovy編寫的,因此您應該可以通過全局Groovy模擬/存根/間諜來模擬構造函數調用(請參閱中的Mocking Constructors,Spock Reference Documentation)。然而,更好的解決方案是分離MyConfigurator類的實現,以使其更具可測性。例如,您可以添加第二個構造函數和/或靜態方法,以允許傳遞SolrZkClient(或基礎接口,如果有的話)的實例。那麼你可以很容易地通過模擬。

+0

感謝彼得,似乎是非常'常識'的建議。推遲接受這個答案,因爲將其付諸實踐一直存在問題。即使是少量代碼的檢查也能說明原因。該類的目的是成爲隱藏SolrCloud配置底層細節的抽象。爲了「抽象出」這些細節,我需要的只是一個connectString。因此,通過對象類試圖隱藏並不是一個真正的選擇。今天會花更多時間在此,我會再次發表評論。 – JoeG

+0

爲什麼你不能添加第二個構造函數? –

+0

這會破壞封裝 - 這個類的目的之一是隱藏SolrZkClient的構造,而不是將它傳遞給調用鏈。 – JoeG

相關問題