2016-11-29 117 views
2

我想測試一個類,它使得方法調用並等待響應通過監聽器。模擬Mockito的回調和監聽器

這些是交互器中的接口。當我打電話給fetch時,其中一個收聽者功能被回叫。

interface Interactor { 
    void fetch(int offset, int size); 
} 

interface InteractorListener { 
    void onReady(List<Result> results); 

    void onError(); 
} 

public class MyInteractor implements Interactor{ 

    private ImageInteractorListener listener; 

    public MyInteractor() {} 

    public onAttach(ImageInteractorListener listener) { 
     this.listener = listener; 
    } 

    public void fetch(int offset, int size) { 
     // Make asyncrhonous task 
     // and manage the response in the next method 
    } 

    public void onAsyncroouTaskResponse() { 
     if (someChecks) { 
      listener.onReady(List<Result> results); 
     } else { 
      listener.onError(); 
     } 
    } 
} 

public class MyClass implements ImageInteractorListener { 

    public MyClass() { 
     MyInteractor interactor = new Interactor(); 
     interactor.onAttach(this); 
     interactor.fetch(1,1); 
    } 

    @Override 
    void onReady(List<Result> results) { 
     // doThings 
    } 

    @override 
    void onError() { 
     // doThings 
    } 
} 

這就是我的課程。我需要測試MyClass,所以我需要模擬交互回調

我已經嘗試了不同的解決方案與不同的問題,所以現在我沒有最終的代碼或錯誤。但沒有人工作..

謝謝。

+0

我不確定我是否理解你的類層次結構。你有一個「班級」,在「Interactor」上調用'fetch'。這個'Interactor'有一個類型爲'InteractorListener'的成員,你想驗證在調用fetch之後,該成員是否調用了onReady或onError? –

+0

我已經添加了示例代碼。謝謝! – adalPaRi

回答

1

假設你正在測試MyClass你可以手動調用你的回調

// Test that errors are handled 

// Given 
Interactor interactor = mock(Interactor.class); 
MyClass myClass = new MyClass(interactor); 

// When 
interactor.fetch(0, 0); // this call is optional, I just added it for clarity 
myClass.onError(); 

// Then 
// verify something 
+0

準確地說 - 如果'MyClass'是被測試的類,你*不能*嘲笑它(否則測試不會有任何意義)。 –

+0

但在你的例子中,你正在嘲笑MyClass,它正在測試 – adalPaRi

+3

在我的例子中,我只嘲笑'Interactor'。 'MyClass'沒有被模擬。 –

1

德米特里的做法是很好的,我個人不叫取的,因爲你的onAsyncroouTaskResponse()是公開的,我會打電話說和然後verify(yourmock).onError()或類似的,以確保它被稱爲。

我有時做的另一種方法是創建一個「TestableSubject」,它只是一個class extends YourOriginalClass,您可以在其中重寫某些方法並保存被調用次數或類似次數。有時候,由於某些類的性質,你不能嘲笑它們(最終的,抽象的東西,私人的等等)。

如果您想要(也許應該)測試的是在完成異步任務後調用回調(不管結果如何),那麼我會跳過獲取部分,您可以測試獲取激發這項工作在另一項測試中,但我認爲在這裏你對後面的部分更感興趣。