java - 使用 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 个方法,它不是最终的。有什么想法吗?
解决方案
事实证明,mExample 正在调用另一个未定义方法的模拟实例。来自另一个 Stack Overflow 帖子链接
如果您滥用 Mockito,它会引发异常,以便您知道您的测试是否正确编写。问题是 Mockito 会在您下次使用框架时进行验证(例如,下次您验证、存根、调用模拟等时)。但是即使在下一次测试中可能会抛出异常,异常消息也会包含一个带有缺陷位置的可导航堆栈跟踪元素。因此,您可以单击并找到 Mockito 被滥用的地方。
因此,在问题中发布的案例中,异常是在
mExample.initialize(mContext, callback);
但直到下次调用 verify 时才抛出。
推荐阅读
- ios - 在 iOS 15 中设置 navigationController?.navigationBar.isTranslucent = false 会使后退按钮命中目标太小且不起作用
- java - 我是否正确编写了此构造函数?
- javascript - Laravel Active 复选框父子
- javascript - 当一个键被按下时,事件发生两次
- http - 通过 HTTP 接口将文件和流添加到 VLC 播放列表
- javascript - Passport-Facebook 不返回个人资料电子邮件
- python - 在 Flask/WTF 中读取复选框的值属性
- python - 谷歌 colab 删除永久文件
- c# - 如何在 C# 中将 ActionResult 转换为 List
- git - 如何从当前分支获取已提交文件的提交和更改?