草庐IT

android - Robolectric 3.0 : Mocking System. currentTimeMillis()

coder 2023-12-10 原文

我正在尝试修改 System.currentTimeMillis() 返回的值,以便我可以执行以下操作:向数据库写入内容,模拟等待 5 分钟,对数据库进行查询(查询取决于写入值)。

[this SO thread] 中建议的代码:

ShadowSystemClock shadowClock = Robolectric.shadowOf(SystemClock.class);
shadowClock.setCurrentTimeMillis(1424369871446);

不编译,因为 shadowOf 方法被移除。尝试替代方案,例如:

ShadowSystemClock shadowClock = new ShadowSystemClock();
shadowClock.setCurrentTimeMillis(1424369871446);

似乎有 issues with overriding currentTimeMillis()但这些问题应该从 3.0 版开始修复。

我可以添加 PowerMock到我的项目并将其用于我认为的这种情况,但如果 R​​obolectric 可以做到这一点,我更愿意这样做。

更新:越来越近了,但可能遗漏了一些东西。这段代码:

ShadowSystemClock shadowClock = new ShadowSystemClock();

Log("system = " + System.currentTimeMillis() + "; shadow = " + shadowClock.currentTimeMillis() + "; time from code = " + Code.getSystemTime());

shadowClock.setCurrentTimeMillis(50000000L);

Log("system = " + System.currentTimeMillis() + "; shadow = " + shadowClock.currentTimeMillis() + "; time from code = " + Code.getSystemTime());

输出这个:

system = 1438212006879; shadow = 0; time from code = 1438212006894
system = 1438212006898; shadow = 50000000; time from code = 1438212006898

Code.getSystemTime() 正在调用正在测试的代码库。该方法仅返回 System.currentTimeMillis()。

如果 ShadowSystemClock 拦截了对 currentTimeMillis() 的调用,似乎一切都可以正常工作。有办法吗?

最佳答案

首先,因为 SystemClock 是一个完全由静态方法组成的单例类,所以不需要使用 shadowOf()shadowOf() 仅在查找对象实例 的阴影时需要。要访问 SystemClock 的影子静态方法,您只需直接调用 ShadowSystemClock 的静态方法,您永远不必通过调用实例化 ShadowSystemClock 。在您的测试代码中,您应该能够免除对 new 的调用并将 shadowClock.currentTimeMillis() 替换为 ShadowSystemClock.currentTimeMillis() .

其次,更直接地与您关于 System.currentTimeMillis() 被拦截的问题相关 - 在 Robolectric 下,这将发生,但仅适用于已被检测的代码 -也就是说,在由 Robolectric 的特殊类加载器加载时进行修改。在检测代码中,所有对 System.currentTimeMillis() 的调用都替换为调用 ShadowSystemClock.currentTimeMillis(),这就是您想要的。

因此,为了让您的测试按您希望的方式工作,您需要确保您正在测试的代码已被检测。默认情况下,Robolectric 不会对所有类执行此操作 - 仅适用于 Android 类。不幸的是,我目前无法亲自测试,但我相信您可以通过在 @Config 注释中指定包来告诉 Robolectric 检测您自己的应用程序类 - 例如,如果您将@Config(instrumentedPackages={ "my.application"}) 在您的测试类或方法上,然后告诉 Robolectric 检测“my.application”包中的所有类。这将反过来导致他们的 System.currentTimeMillis() 调用重定向到 ShadowSystemClock.currentTimeMillis(),这应该是您想要的。

这样做不同的原因是因为使用 Robolectric 的类加载器方法,无法修改 java.lang.* 包中的类,因为它们在您安装检测类加载器之前已经加载.有一个更长期的想法,即使用类似于 JMockit 所做的方法在 Robolectric 中尝试以不同方式执行此操作,这可以解决此问题。这意味着您不必显式检测所有客户端类。然而,目前这是天上掉馅饼,我不会屏住呼吸等待它 - 希望以上内容能解决您眼前的问题。

希望这对您有所帮助。

关于android - Robolectric 3.0 : Mocking System. currentTimeMillis(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31659771/

有关android - Robolectric 3.0 : Mocking System. currentTimeMillis()的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - 开始新的 Rails 3.0 项目时应该使用 ruby​​ 1.9.2 吗? - 2

    应用将在Heroku上运行依赖包括回形针哈姆指南针设计aws-s3支持或反对的理由?对其他版本的ruby​​有什么建议吗?更新Heroku目前不支持1.9.2,但预计很快会基于thispost.Rails3.0正式支持1.9.2(但不支持1.9.1),所以我决定继续使用它。更新Heroku在其beta堆栈上支持1.9.2。 最佳答案 我会说是的。当您准备好推出您的应用程序时(2-3个月?),应该解决越来越多的兼容性问题。此外,如果您遇到任何问题,您可以提交补丁并为更快的1.9.2兼容性做出贡献!;)但是为了回答您的问题,考虑到您要使

  3. ruby - Capistrano 3.0 文件传输? - 2

    似乎Capistrano曾经有anextensivefiletransferpackage.但是在3.0版本重写后好像没有了。知道是否还有其他方法可以将文件传输到服务器/从服务器传输文件吗? 最佳答案 下载:desc"downloadfoobar.txtintolocal_dir/"task:foobardodownload!"some_remote_path/foobar.txt","local_dir/"end我知道这从Cap3.2.1开始有效,因为我现在正在使用它。 关于ruby-

  4. ruby - "gem update --system"会将 rails 从 2.3.8 更新到 3.0 吗? - 2

    如果我有第二台计算机,我会这样做并看看-但我已经对它进行了微调,使其暂时不运行3.0......不想搞砸它。花了好几个小时才到这里。基本上-我想将rails保持在2.3.8一段时间......所以会gemupdate--system更新rails从版本2->3?我确实阅读了没有明确答案的文档,我猜它会,但是嘿,可能会学到一些新东西。否则,我会更新我拥有的每一个(8-1个)gem。谢谢... 最佳答案 gemupdate--system仅更新RubyGems。gemupdate会将所有已安装的gem更新到最新版本,因此会将Rails更

  5. ruby - 从 Rails 3.0 升级到 Rails 3.2(Ruby 1.9.3 + Passenger)后出现巨大的内存泄漏/膨胀 - 2

    上周我们将一个在Rails3.0.1上运行的小项目升级到了Rails3.2.2。升级后不久,我们发现偶尔,一天2-3次,我们会看到一个巨大的PhusionPassenger进程(1-5GB)。我们正在运行PhusionPassenger3.0.11和Ruby1.9.3-p0。我们已经尝试了不同的Ruby版本(1.9.2-p290和1.9.3-p125)但没有成功。之后,我们尝试使用Oink来跟踪我们的内存使用情况.不幸的是,Oink没有显示内存膨胀的原因——大型进程似乎不再写入日志文件。当我们降级回Rails3.0.1时,问题就消失了。有没有人有类似的问题?我们确实检查了我们的代码是否

  6. ruby - Capistrano 3.0 — 现在如何安全地提示输入密码? - 2

    在3.0之前有一种方法可以做到这一点:#...set:mysql_password,proc{Capistrano::CLI.password_prompt"Gimmeremotedatabaseserverpassword.Don'tworry,Iwon'ttellanyone:"}#...namespace:dbdodesc'Dumpremotedatabase'task:dumpdorun"mysqldump-u#{mysql_user}-p#{mysql_database}>~/#{mysql_database}.sql"do|channel,stream,data|ifdat

  7. ruby - Spree 3.0 添加到扩展中允许的属性 - 2

    所以我正在做一个spree扩展,其中我有我自己的属性,我添加到Spree::Shipment并在结帐过程中添加了一个输入,问题是我的属性不是部分装运的允许属性,目前尚不清楚如何将其添加到允许属性中。我在thispullreq上找到了对话上面说要使用Spree::PermittedAttributes.shipment_attributes但是,不清楚我应该把它放在哪里!?“哦,把它放在spree.rb”这没有帮助。我试过把这段代码放在lib/spree.rblib/spree/permitted_attributes.rblib/spree_decorator.rblib/spree/

  8. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  9. Android 10.0 设置默认launcher后安装另外launcher后默认Launcher失效的功能修复 - 2

    1.前言 在10.0的系统rom定制化开发中,在系统中有多个launcher的时候,会在开机进入launcher的时候弹窗launcher列表,让用户选择进入哪个launcher,这样显得特别的不方便所以产品开发中,要求用RoleManager的相关api来设置默认Launcher,但是在设置完默认Launcher以后,在安装一款Launcher的时候,默认Launcher就会失效,在系统设置的默认应用中Launcher选项就为空,点击home键的时候会弹出默认Launcher列表,让选择进入哪个默认Launcher.所以需要从安装Launcher的流程来分析相关的设置。来解决问题设置默认La

  10. AiBote 2022 新研发的自动化框架,支持 Android 和 Windows 系统。速度非常快 - 2

    Ai-Bot基于流行的Node.js和JavaScript语言的一款新自动化框架,支持Windows和Android自动化。1、Windowsxpath元素定位算法支持支持Windows应用、.NET、WPF、Qt、Java和Electron客户端程序和ie、edgechrome浏览器2、Android支持原生APP和H5界面,元素定位速度是appium十倍,无线远程自动化操作多台安卓设备3、基于opencv图色算法,支持找图和多点找色,1080*2340全分辨率找图50MS以内4、内置免费OCR人工智能技术,无限制获取图片文字和找字功能。5、框架协议开源,除官方node.jsSDK外,用户可

随机推荐