用Mockito模拟回调和听众

时间:2016-11-29 15:37:34

标签: android 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,所以我需要模拟Interactor回调

我尝试过不同问题的不同解决方案,所以现在我没有最终的代码或错误。但没有人工作..

谢谢。

2 个答案:

答案 0 :(得分:2)

假设您正在测试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

答案 1 :(得分:1)

Dimitry的方法很好,我个人不会打电话,因为你的onAsyncroouTaskResponse()是公开的,我会打电话给verify(yourmock).onError()或者类似的确定它被称为。

我有时采用的另一种方法是创建一个&#34; TestableSubject&#34;这只是一个class extends YourOriginalClass,您可以覆盖某些方法并保持其被调用的次数或类似值。有时候,由于某些课程的性质,你不能嘲笑它们(最终的,抽象的东西,私人的等等)。

如果您想要(也许应该)测试的是,在完成异步任务后,将调用您的回调(无论结果如何),然后我跳过获取部分,您可以测试该获取在另一个测试中解雇了这个工作,但我想在这里你对后面的部分更感兴趣。