Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Mockito模拟回调和侦听器_Android_Mockito - Fatal编程技术网

Android 使用Mockito模拟回调和侦听器

Android 使用Mockito模拟回调和侦听器,android,mockito,Android,Mockito,我试图测试一个类,它进行方法调用并通过侦听器等待响应 这些是交互器内部的接口。当我调用fetch时,一个侦听器函数被回调 interface Interactor { void fetch(int offset, int size); } interface InteractorListener { void onReady(List<Result> results); void onError(); } public class MyInteracto

我试图测试一个类,它进行方法调用并通过侦听器等待响应

这些是交互器内部的接口。当我调用
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
    }
}
接口交互器{
无效提取(整数偏移量、整数大小);
}
接口交互列表器{
void onReady(列出结果);
void onError();
}
公共类MyInteractor实现了Interactor{
私有ImageInteractiorListener侦听器;
公共MyInteractor(){}
公共onAttach(ImageInteractitorListener侦听器){
this.listener=listener;
}
公共无效获取(整数偏移量、整数大小){
//进行异步任务
//并在下一种方法中管理响应
}
SyncRooutAskResponse()上的公共无效{
如果(某些支票){
onReady(列出结果);
}否则{
listener.onError();
}
}
}
公共类MyClass实现ImageInteractiorListener{
公共MyClass(){
MyInteractor interactor=新的interactor();
interactior.onAttach(这个);
interactior.fetch(1,1);
}
@凌驾
void onReady(列出结果){
//多思
}
@凌驾
void onError(){
//多思
}
}
这就是我的课程是如何制作的。我需要测试
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
我用不同的问题尝试了不同的解决方案,所以现在我没有最终的代码或错误。但是没有人工作


谢谢。

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

Dimitry的方法很好,我个人不会调用fetch,因为您的
onAsyncroouTaskResponse()
是公共的,我会调用它,然后
验证(yourmock).onError()
或类似的方法来确保它被调用

我有时会采用的另一种方法是创建一个“TestableSubject”,它只是一个扩展了原始类的
类,在这个类中重写某些方法并记录调用它的次数,或者类似的方法。有时,由于某些类的性质,您不能全部模仿它们(final、abstract、private等)


如果您想要(或者应该)测试的是,在异步任务完成后,您的回调将被调用(无论结果如何),那么我将跳过fetch部分,您可以在另一个测试中测试fetch是否触发作业,但我认为您更感兴趣的是后面的部分

我不确定我是否理解您的类层次结构。您有一个“类”,它在
交互器上调用
获取
。此
interactitor
有一个类型为
interactitorlistener
的成员,您想验证调用fetch后该成员中是否调用了
onReady
onError
?我添加了示例代码。非常感谢。确切地说-如果
MyClass
是正在测试的类,则不能对其进行模拟(否则测试将毫无意义)。但在您的示例中,您是在模拟MyClass,而在我的示例中,我只是在模拟
Interactior
<代码>MyClass
未被模拟。