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 间谍 - 调用内部类方法而不是监视间谍对象中的方法时 的相关文章

  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • Android 如何将总天数准确更改为年、月、日?

    我正在做一个应用程序 该应用程序与根据给定的生日日期输入获取一个人的年龄有关 为此 我从下面的代码中获取从该日期到当前日期的总天数 String strThatDay 1991 05 10 SimpleDateFormat formatte
  • 在 Samsung Galaxy S5 Android 5.0 上使用 MediaPlayer 加载音频流需要超过 10 秒

    由于更新至 Android 5 0 MediaPlayer 在 Samsung Galaxy S5 上无法正常工作 启动音频流后加载时间超过 10 秒 示例代码 MediaPlayer mPlayer new MediaPlayer Str
  • 如何检查 Android 中的同步设置

    我正在构建一个 Android 应用程序 我需要检查设备中注册的每个单独帐户的同步设置 我知道我可以通过 ContentResolver 类来做到这一点 但我遇到了一些问题 我已设法获取设备上所有帐户的列表 但我不知道在运行时从哪里获取特定
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

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

    我有以下 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