2016-01-21 155 views
0

返回的數據有下面的代碼我如何嘲弄在單元測試

Class A { 
    public boolean showData() { 
     NewData data = getNewData(); 
     if (data!=null) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public NewData getNewData() { 
     return NewData = abc; 
    } 
} 

我需要模擬getNewData返回嘲笑數據,當我打電話showData()。

需要明確的是,

如果我嘲笑像下面的getNewData,

when(a.getNewData()).thenReturn(null); 
assertFalse(showData()) // this doesn't work because the mocked internal getNewdata is not used. 

是有辦法解決這一問題?

+1

你使用的是什麼模擬框架? – assylias

+0

你能展示更多的測試,包括模擬設置嗎? – chinaowl

+1

在這種特殊情況下,在A中有一個構造函數需要一個NewData是有意義的 - 這樣你可以很容易地測試......換句話說,在使用應該是最後一個的mock之前,試着讓你的類更易測試採取。 – assylias

回答

1

假設你想測試A.showdata,你可以從A派生一個類來覆蓋getNewData,它返回你需要測試的任何東西。這是一種被稱爲「子類和覆蓋」的技術。

編輯:僞代碼,請執行以下操作:

Class B: public A { 
    public NewData getNewData() { 
     return <whatever you need for your test> 
    } 
} 

現在,爲了測試A.showData,請執行以下操作:

B mySut = new B(); 
Bool result = mySut.showData(); // this calls A.showData, which calls B.getNewData. 
+0

你能否給我一個例子pleae – user3722531

+0

添加了一些示例僞代碼。無論如何,你可以在網上搜索'子類並覆蓋'以獲得更多更好的例子。 –

+0

謝謝,這將工作.. – user3722531

0

最好的辦法是注入NewData進入方法作爲參數

showData(data)並且具有調用showData的類/方法getNewData()

嘲笑時,依賴注入是問題的一般答案(以我的經驗)。這允許你傳遞你想要的方法使用的確切的NewData,因此模擬。

+0

我不想改變現有的代碼,有沒有辦法做到這一點,而無需更改代碼 – user3722531