2016-11-29 46 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,您可以在其中重写某些方法并保存被调用次数或类似次数。有时候,由于某些类的性质,你不能嘲笑它们(最终的,抽象的东西,私人的等等)。

如果您想要(也许应该)测试的是在完成异步任务后调用回调(不管结果如何),那么我会跳过获取部分,您可以测试获取激发这项工作在另一项测试中,但我认为在这里你对后面的部分更感兴趣。