Mockito 间谍 - 调用内部类方法而不是监视间谍对象中的方法时

2023-11-25

我的内部类如下:

public class ClassWithInnerObject {

  private final InnerObject innerObject;

  public ClassWithInnerObject() {
    innerObject = new InnerObject();
  }

  public void callInnerObjectMethod() {
    innerObject.outerFunc();
  }

  public void outerFunc() {
    innerFunc();
  }

  public void innerFunc() {
    Log.d("XXX", "innerFunc: called");
  }

  public class InnerObject {
    public void outerFunc() {
      innerFunc();
    }
  }
}

Mockito 测试如下所示: 构建.gradle:

  androidTestCompile 'junit:junit:4.12'
  androidTestCompile 'org.mockito:mockito-core:1.10.19'

  androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4'
  androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4'
  androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4'

Test:

@RunWith(AndroidJUnit4.class) public class SpyVerifyTest {

  @Test public void myInnerTestWorking() {
    ClassWithInnerObject p = new ClassWithInnerObject();
    ClassWithInnerObject spy = Mockito.spy(p);
    spy.outerFunc();
    verify(spy, times(1)).innerFunc();
  }


  @Test public void myInnerTestNotWorking() {
    ClassWithInnerObject p = new ClassWithInnerObject();
    ClassWithInnerObject spy = Mockito.spy(p);
    spy.callInnerObjectMethod();
    verify(spy, times(1)).innerFunc();
  }

}

第一次测试按预期进行。 第二个是innerFunc从未被检测为“调用”,尽管在日志中我看到它是。出了什么问题? :)

Thanks!


怎么了?

嗯,这里的问题非常微妙,当你打电话时Mockito.spy(p), mockito在幕后创建某种装饰器在您的实例上ClassWithInnerObject允许监视实例上的所有方法调用。多亏了这一点,您可以检查给定方法被调用了多少次但仅在装饰器上不在你的实例上。在这里,当您使用内部类时,它会调用innerFunc()在你的实例上ClassWithInnerObject不在装饰器上,所以对于Mockito innerFunc() 尚未被调用.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mockito 间谍 - 调用内部类方法而不是监视间谍对象中的方法时 的相关文章

随机推荐

  • 对受保护嵌套类的友元访问

    我有以下 C 代码 class A protected struct Nested int x class B public A friend class C class C void m1 B Nested n or A Nested 使
  • 我刚刚在 Eclipse 中创建了小型 android 项目,我应该将哪些文件添加到版本控制中?

    我不知道哪些文件应该为 eclipse 中创建的新 android 项目进行版本控制 谁能告诉我 我应该添加什么 几乎构建项目所需的一切 包括 project and classpath 是的 您应该明确添加它们 前提是 classpath
  • 错误:MEX 文件无效,找不到指定的模块

    我已经在我的笔记本电脑上成功编译了 Mex 文件 但是当我运行它时 它说Invalid mex file c newfolder filename mexw32 The specified module could not be found
  • ruby 中的同一程序如何接受用户输入以及命令行参数

    我的 ruby 脚本从命令行参数获取某些输入 它检查是否缺少任何命令行参数 然后提示用户输入 但我无法使用 gets 从用户那里获取输入 示例代码 test rb name ARGV each do a if a include n nam
  • ASP.NET:如何处理并行请求

    让我们想象一下网站上有 2 个页面 快速页面和慢速页面 对慢速页面的请求执行 1 分钟 对快速页面的请求执行 5 秒 在我的整个开发生涯中 我认为如果第一个启动的请求很慢 他将对数据库进行 同步 调用 等待答案 如果在此期间完成对快速页面的
  • Flutter:应该只有一项具有 [DropdownButton] 的值

    我正在尝试创建一个下拉按钮在颤振中 我得到了列表来自我的数据库然后我将列表传递给我的dropdownButton 一切正常数据按预期显示 但是当我从中选择一个元素时我收到此错误 There should be exactly one ite
  • SpecFlow 与数据库模式的集成测试

    我正在尝试设置 SpecFlow 进行集成 验收测试 我们的产品在 Sqlite 中有一个支持数据库 虽然不是很大 但这实际上被证明是一个有点棘手的问题 如何为测试建立数据库模型 我想知道其他人使用什么模式来对支持数据库进行集成 验收测试
  • 用于单独 HTML 页面的 GWT 多模块?

    我对 GWT 很陌生 打算使用 GWT 开发用户管理应用程序的 UI 我计划使用使用 Spring Hibernate 创建的现有模块 我想出了如何将 GWT 与 Spring 集成 但我不知道如何设计布局 我想要两页 用户注册页面 想要在
  • 发生验证错误时 Symfony2 表单字段未更新

    这是我的表单类型 class TestFormType extends AbstractType public function buildForm FormBuilderInterface builder array options bu
  • 插入排序比冒泡排序更好?

    我正在为考试做复习 想知道在相同的平均情况复杂度为 O N 2 的情况下 插入排序比冒泡排序表现更好 我确实找到了一些相关文章 但我无法理解它们 有人介意用简单的方式解释一下吗 冒泡排序的优点在于检测已排序列表的速度 冒泡排序最佳案例场景
  • shapefile 和 matplotlib:绘制 shapefile 坐标的多边形集合

    我正在尝试使用 python 中的 matplotlib 在世界地图上绘制国家 地区的填充多边形 I ve got a shapefile with country boundary coordinates of every country
  • ListView 和带有倒计时器的项目

    我的 Listview 有问题 我想为所有 ListView 的项目设置一个倒计时器 并且我已经在 google 上搜索了解决方案 但它无法正常工作 问题是 ListView 重用 回收 视图 并且我总是得到错误的项目时间 我在视图中使用了
  • 使用 JAXB 2.1 将多个模式编译到不同的包中

    我有一个 CommonTypes xsd 我使用 xs include 将其包含在我的所有其他 XSD 中 我明白了 Multiple
  • 蓝鸟中的嵌套承诺

    我试图弄清楚如何在蓝鸟库中正确使用承诺 我在代码中遇到了一些嵌套的承诺 我注意到在 bluebird 文档中它写道 如果您使用完整的 bluebird API 产品 您几乎永远不需要首先求助于嵌套承诺 还有许多其他关于承诺被滥用的博客文章嵌
  • 用于 SMS 的 ContentObserver [重复]

    这个问题在这里已经有答案了 我正在尝试提取发送的短信 我知道没有用于此目的的 BroadcastReciver 所以我发现我可以使用 ContentObserver 来监听数据库中的更改 我怎样才能实现这个 我的目标是仅获取发送的新短信并通
  • 两个相同的字符串不相等(不是指针/引用错误)

    我从文件中读取了一行 KatalogObrazk w 1 32 意味着我应该在以下位置查找数据 C Users NAME OF THE USER KatalogObrazk w 所以我就这么做了 但可怕的事情正在发生 在splitLine
  • WPF:即使显式设置 WindowState,窗口仍保持最小化

    我的应用程序有一个托盘图标 双击该图标可隐藏或显示应用程序窗口 我的问题是 如果窗口隐藏时处于最小化状态 我似乎无法将窗口带到前台 例如 假设用户最小化应用程序 然后双击托盘图标 然后应用程序窗口将隐藏并从任务栏中消失 当用户再次双击托盘图
  • GenyMotion 虚拟设备打开并立即消失

    我下载了带有虚拟 VM 包的 GenyMotion Android 模拟器 一切都很顺利 直到虚拟设备下载过程为止 虚拟设备已成功下载 但当我尝试通过点击播放按钮运行虚拟设备时 会弹出一个小窗口 显示正在初始化虚拟设备 然后启动虚拟设备 几
  • 如何仅在触发特定活动后启动 FCM ID 服务?

    假设我有一个LoginActivity用户可以在其中使用现有凭据注册或登录 我不想要FirebaseInstanceIdService生成令牌 除非用户已登录并且MainActivity应用程序的启动 谢谢 你无法阻止FirebaseIns
  • Mockito 间谍 - 调用内部类方法而不是监视间谍对象中的方法时

    我的内部类如下 public class ClassWithInnerObject private final InnerObject innerObject public ClassWithInnerObject innerObject