首页 > 解决方案 > 使用 Mockito 模拟接口时出现异常

问题描述

我正在尝试测试是否调用了接口方法并传入了确切的值。我收到以下错误:

org.mockito.exceptions.misusing.UnfinishedVerificationException:在此处缺少验证(模拟)的方法调用:-> 在 com.example.app.initialize(example.java:136)

正确验证示例:verify(mock).doSomething()

在此验证行上引发错误:

Mockito.verify(callback).onInitializeResult("initialized");

我的接口类:

public interface InitCallback {
/**
 * Returns whether or not the app was initialized.     .
 */
    void onInitializeResult(String result);
}

我的单元测试:

@Test
    public void initializationTest(){
        InitCallback callback = Mockito.spy(new InitCallback() {
            @Override
            public void onInitializeResult(String result) {

            }
        });
        mExample.initialize(mContext, callback);
        Mockito.verify(callback).onInitializeResult("initialized");
    }

我还尝试将回调模拟替换为:

InitCallback callback = Mockito.mock(InitCallback.class);
Mockito.doNothing().when(callback).onInitializeResult(Mockito.anyString());

但是我仍然遇到同样的错误。该接口只有 1 个方法,它不是最终的。有什么想法吗?

标签: javaandroidunit-testingmockingmockito

解决方案


事实证明,mExample 正在调用另一个未定义方法的模拟实例。来自另一个 Stack Overflow 帖子链接

如果您滥用 Mockito,它会引发异常,以便您知道您的测试是否正确编写。问题是 Mockito 会在您下次使用框架时进行验证(例如,下次您验证、存根、调用模拟等时)。但是即使在下一次测试中可能会抛出异常,异常消息也会包含一个带有缺陷位置的可导航堆栈跟踪元素。因此,您可以单击并找到 Mockito 被滥用的地方。

因此,在问题中发布的案例中,异常是在

mExample.initialize(mContext, callback);

但直到下次调用 verify 时才抛出。


推荐阅读