2015-08-08 72 views
6

我已經使用過JUnit和Mocks,但是我想知道,JUnit中的Mocks和Stubs以及如何在JUnit,Java中使用Stubs有什麼區別? 作爲具有EasyMock,Mockito等的Mock,Stubs在Java中使用了什麼?Java - 如何在JUnit中使用存根

請給出Java中存根的一些示例代碼。

謝謝!

+0

希望這【答案】(http://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock -stub)會幫助你 –

+0

我已經閱讀過,但沒有幫助:( – Hamid

+0

提問示例代碼和他們已經完成的現有研究是問責提供者的責任,這個問題需要改進。 –

回答

10

要在junit中使用存根,您不需要任何框架。

如果你想存根一些接口只是實現它:

interface Service { 
    String doSomething(); 
} 

class ServiceStub implements Service { 
    public String doSomething(){ 
     return "my stubbed return"; 
    } 
} 

然後創建新的存根對象,並將其注入到被測對象。

如果你想存根具體類,創建子類並覆蓋存根方法:

class Service { 
    public String doSomething(){ 
     // interact with external service 
     // make some heavy computation 
     return "real result"; 
    } 
} 

class ServiceStub extends Service { 
    @Override 
    public String doSomething(){ 
     return "stubbed result"; 
    } 
} 
+0

你的意思是我只是再次編寫一些代碼,但這次更簡單併爲此編寫測試用例? 一個接口,一個類和一個測試類? 那是它? – Hamid

+0

@哈米德是的,你說得對。如果你想使用模擬,我想有些類需要與外部服務或數據庫進行交互。爲了避免這些交互,你可以用比原始類更容易的實現方式編寫存根。 –

+0

你介意給我舉個例子嗎?它是如何更容易? – Hamid

12

不要緊,在我看來,框架或技術。模擬和存根可以定義如下。

存根是系統中現有依賴關係(或協作者)的可控替換。通過使用存根,您可以測試代碼而不直接處理依賴關係。

模擬對象是系統中的假對象,它決定單元測試是通過還是失敗。它通過驗證被測對象是否與假對象按預期進行交互一樣進行。

也許這些圖像可以闡明存根和模擬之間的相互作用。

存根 Stub

模擬 Mock

+0

感謝您的定義;) – Hamid

+0

您的意思是,當我們使用存根時,我們不創建stubClass的對象? – Hamid

+0

根據@Sergey Lagutin的答案。您創建存根以提供給CUT(測試中的代碼/類) - 存根是依賴關係替換。 –