2011-08-22 74 views
11

更完整的問題是,給定一個需要回調作爲參數的依賴關係,如何編寫一個涵蓋回調邏輯的單元測試仍然可以模擬依賴關係?如何對單元測試回調邏輯?

public class DoStuff { 
    public void runThis(Runnable callback) { 
     // call callback 
    } 
} 

public class ClassUnderTest { 
    private DoStuff stuffToDo; 

    public void methodUnderTest() { 
     this.stuffToDo.runThis(/*a runnable with some logic*/) 
    } 
} 

在上面的例子中,我會嘲笑stuffToDo因爲我應該驗證呼叫和方法調用的模擬輸出。然而,嘲諷runThis導致回調邏輯未被測試。此外,回調邏輯看起來應該是私有的,所以我不希望直接測試它;也許這是我的誤解。由於回調的使用相當廣泛,我期望有一個測試它們的常用方法,但我沒有找到它。

+0

回調只需要在這種情況下進行測試嗎?如果是這樣,爲什麼不簡單地爲您計劃傳遞的各種回調編寫測試,這些回調錶達了您對結果的期望?我錯過了什麼嗎? – Jonah

+0

您是否嘗試過使用CountDownLatch,如下例所示:http://stackoverflow.com/a/3802487/2301224 – Baker

回答

10

您不能在單個測試中。如果你嘲笑一些東西,嘲笑,這意味着它只能驗證參數並模擬返回值(在測試中配置)。

事實上,嘲笑某件事的全部觀點是要測試孤立地使用模擬的是什麼。如果你想要一個DoStuff的單元測試,你不必擔心使用一些可能或可能不起作用的回調實現。你嘲笑回調,所以你不必擔心它。

你仍然可以有通過測試,隔離,回調代碼測試隔離回調用戶(使用回調一個模擬)良好的測試,並可能通過的好措施,在您使用拋出集成測試完整配置的組件。

1

這裏基本上你想測試類DoStuff。這意味着你需要直接測試DoStuff中的所有方法,對嗎?所以在這種情況下,你需要做的是,而不是嘲笑stuffToDo本身,注入一個嘲弄的runnable into stuffToDo。然後檢查你的runnable是否成功執行。

但是,如果你在課堂上還有其他功能,你可以單獨測試並將其模擬出來。

+1

我想測試將DoStuff作爲依賴關係的ClassUnderTest。 –

0

在你的特定情況下,聽起來好像你已經測試了DoStuff(或者因爲它被嘲笑而不再在意),現在特別針對你設計的特定Runnable進行了單元測試。在這種情況下,callback聽起來像你想要測試的東西,用同樣的方式,有人可能想直接單元測試數據庫策略或內存策略。

如果這是您正在嘗試的操作,您可以在黑盒中測試它,儘可能通過ClassUnderTest進行測試。或者您可以在特定的Runnable上創建測試工具。如果您要發佈此代碼,並且不想讓測試工具可到達,則可以使測試工具的方法處於隱私狀態,並與您的單元測試程序集一起分享其詳細信息。

查看here瞭解如何製作好友程序集。我通常簽署我的單元測試代碼,這樣我就不必使用命令行編譯器了。我想這取決於你的構建環境。

+0

不,ClassUnderTest是要測試的類。我在嘲笑DoStuff。 –

+0

我修改了類名來反映這一點。它不影響答案。 –

0

如果您使用EasyMock,則可以使用andStubAnswer來調用runnable。

doSomethingMock.runThis(runnable); 
expectLastCall().andStubAnswer(new IAnserable<Void>() { 
    Runnable runnable = (Runnable)getCurrentArguments()[0]; 
    runnable.run(); 
    return null; 
}); 

我想其他嘲笑框架包含類似的東西。

0

無條件調用Runnable的假的DoStuff如何?

然後你只是感覺到效果 - 如果你的回調被執行,應該觀察到的變化。