2011-07-27 34 views
1

最常見的使用情況進行嘲諷是何時避免嘲笑?

objA uses objB; 
use objA without having objB populated/initialized 

使

@Mock 
private UserInterface userInterface; 

public void method() { 
    MockitoAnnotations.initMocks(this); 
    Client client; 
    client.setUserInterface(userInterface); 
    when(userInterface.getSomething()).thenReturn(new OutputType("f")); 
    client.doSomething(); 
} 

但是,如果我們確實需要objA的只能輸出? 讓我們說,我們不想叫objA.doSomething();返回SomeOutput,得到SomeOutput,所以我們可以

  1. 嘲笑它DoSomething的()返回SomeOutput; - 沒有多大意義

  2. new SomeOutput(bla, bla, bla);填充變量而不嘲笑任何東西。

我這麼問是因爲我看到程序員嘲笑的第二種方式,這實際上是沒有意義的原因,他們只是實例new SomeOutput(bla, bla, bla);並通過嘲笑objA返回它;

它有什麼祕密的目的嗎?我對嘲笑比較陌生。

回答

1

我不知道我是否有你,但我會盡力回答。 嘲笑的目標(你可能已經知道)是隔離你正在測試的那段代碼。一個單元測試(我假設我們正在談論單元測試,當有嘲笑) 應該只測試一件事。在您的例子,你可以這樣做:

new SomeOutput(bla, bla, bla); 

即使結果是,您將獲得嘲諷的對象在這種情況下,你不分離,你想測試,因爲你是「呼籲」之類一樣依賴組件代碼

無論如何,我可以建議你看看這本書

http://artofunittesting.com/

即使是在.NET中的概念仍然是相同的

12

嘲笑是偉大的,當你想測試交互之間的組件。

當你不關心交互,但你希望一個組件能夠向另一個組件提供數據時,存根和假貨是偉大的。與使用模擬框架相比,這最終可能需要更長的時間才能創建,但後來編寫進一步的測試通常更容易。許多模擬框架還提供了存根功能。

對於已經測試過的簡單類型(通常提供數據而不是服務),只需使用實際類型即可。

請參閱Martin Fowler's articles on mocks and stubs一些更多的啓示。