模拟 Instant.now() 而不使用 Clock 进入构造函数或不使用 Clock 对象

2024-01-13

我的方法之一中有以下代码

ZonedDateTime current = Instant.now().atZone(ZoneId.of(AMERICA_NEW_YORK));

我想嘲笑current在 JUnit 测试中。

我尝试过java.time.Clock但为此,我需要将其添加到类构造函数中,因为我的代码被写入旧版本的 Spring 中,并且使用基于 XML 的配置,此类会导致问题,因为如果我使用构造函数,它需要 application-context.xml 文件中的构造函数参数和Clock.

有没有办法避免构造函数配置和模拟current在上面的代码中。

Update

根据帕维尔·斯米尔诺夫的评论,我在下面尝试过,但是current仍然返回今天的日期,但不是我嘲笑的日期。

ZonedDateTime exactOneDay = ZonedDateTime.parse("Sun Oct 21 12:30:00 EDT  2018", Parser); 
doReturn(exactOneDay).when(spyEmployeeHelper).getCurrentTime();
employee = getEmployees().get(0);
assertEquals(Integer.valueOf(1), employee.getNoticePeriod());

基于 Mockito 的解决方案,其中代码使用普通Instant.now()

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;

import java.time.Clock;
import java.time.Instant;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

public class MockInstantTest {

  private MockedStatic<Clock> clockMock;

  @BeforeEach
  public void setup() {
    mockInstant(1640000000); // set desired return value 2021-12-20T11:33:20Z
  }

  @AfterEach
  public void destroy() {
    clockMock.close();
  }

  private void mockInstant(long expected) {
    Clock spyClock = spy(Clock.class);
    clockMock = mockStatic(Clock.class);
    clockMock.when(Clock::systemUTC).thenReturn(spyClock);
    when(spyClock.instant()).thenReturn(Instant.ofEpochSecond(expected));
  }

  @Test
  void testWithMockedIstant() {
    // invoking Instant.now() will always return the same value
    assertThat(Instant.now().toString()).isEqualTo("2021-12-20T11:33:20Z");
  }
}

解决方案解释

解决方案依赖于以下事实:Instant.now()调用Clock.systemUTC().instant()

  • Clock是抽象的,所以我们监视非静态方法
  • clock.instant()被嘲笑返回所需的值
  • Clock.systemUTC()是静态的所以我们需要mockStatic
  • using @Before/@After需要关闭 MockedStatic (或者您可以使用try(MockedStatic<Clock> clockMock = mockStatic(Clock.class)) {...})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模拟 Instant.now() 而不使用 Clock 进入构造函数或不使用 Clock 对象 的相关文章

随机推荐

  • 如何在 React hook 中创建新的 JSON 对象?

    我首先有两个问题 如何在挂钩中添加 更新 JSON 项目 另一个是 React 不允许我使用以前的 JSON 文件中存储的名称 基本上 我对其他解决方案持开放态度 因为我的输入字段是从 JSON 文件动态生成的 我不确定存储或访问输入到其中
  • 仅水平滚动的 Div 不起作用

    我有一个具有以下样式的 div height 200px overflow x scroll overflow y hidden width 682px 我需要元素在一行上彼此相邻 仅水平滚动 里面的元素有以下样式 width 60px p
  • 关于可移植性的 $PWD 与 pwd

    我正在编写一个 shell 脚本 它解析当前工作目录的路径 打印当前目录上方的所有基本名称 到目前为止 我一直在使用环境变量PWD解析路径 但我想知道是否 我可以信赖PWD始终被设置 在每个平台上给出相同的结果 使用pwd外壳内置 我需要这
  • java.lang.ClassCastException:java.util.ArrayList无法转换为javax.faces.model.SelectItem [重复]

    这个问题在这里已经有答案了 我正在尝试使我的下拉菜单动态化 下面是我收到的代码和异常 请帮帮我 bean private String dropDownValue List
  • 如何将数组[字符串]存储到输出文件[重复]

    这个问题在这里已经有答案了 我有一个名为 samparr 的数组 String 其中包含一些值 我希望将其存储为输出文件 var samparr Array String new Array String 4 samparr print1
  • libavcodec.so:具有文本重定位

    我正在 Nexus 5 上测试 Android 6 0 并使用 Metaio 我知道该服务将于 12 月 15 日结束 但在那一天我们将转移到另一个 AR 平台 问题是当我启动 ARActivity 时出现以下错误 09 02 08 45
  • 如何将 Bert 嵌入提供给 LSTM

    我正在研究用于文本分类问题的 Bert MLP 模型 本质上 我试图用基本的 LSTM 模型替换 MLP 模型 是否可以创建带有嵌入的 LSTM 或者 最好创建一个带有嵌入层的 LSTM 更具体地说 我很难尝试创建嵌入矩阵 因此我可以使用
  • 限制android中的覆盖

    测验黑客应用程序 https play google com store apps details id com hostelmanager quizhackk在我的测验应用程序中作弊 我如何限制它在我们的应用程序上绘制它的叠加层 canD
  • 为 Rails 应用程序构建扩展框架

    我正在开始研究为 Rails 应用程序构建用户级插件系统 如 Wordpress 插件 所需的内容 因此我希望获得一些一般性的指示 建议 我所说的用户级插件是指用户可以将其提取到文件夹中并将其显示在管理界面上的包 从而允许他们添加一些额外的
  • SQL 在单独的行上选择每个选定列的值

    我有一个包含数百行和数十 W 列的表 Column1 Column2 W Column3 W ColumnX W 123 A B x 223 A NULL NULL 我如何选择它以便输出为 Column1 W 123 A 123 B 123
  • 使用 PowerMock + EasyMock 模拟最终方法

    我正在尝试模拟对最终方法的调用ResourceBundle getString 使用 PowerMock 1 4 12 和 EasyMock 3 1 调用不会被模拟 相反 调用 真实 方法 我的测试课 RunWith PowerMockRu
  • 闪亮的应用程序:删除带有操作按钮的 UI 对象

    使用以下代码 可以在 Shiny 中创建 UI 对象 library shiny LHSchoices lt c X1 X2 X3 X4 MODULE UI variablesUI lt function id number ns lt N
  • 如何使用 Play Framework 测试电子邮件逻辑

    我有一个扩展 Mailer 的类 并且希望对此进行自动测试 使用模拟邮件程序 我可以将邮件发送到控制台 但如何从自动化测试中测试邮件逻辑 有没有类似的东西使用 Rails 进行邮件测试 http guides rubyonrails org
  • 尝试为程序集/nasm 应用程序创建 Makefile 文件

    我正在尝试创建一个简单的 make 文件 我现在使用的命令是 nasm f elf64 main asm ld s o test1 main o 就是这样 我如何从它们创建一个 Makefile 我已经阅读了手册 但还没有找到解决方案 您可
  • Unity:需要在返回池时重置池对象。也许使用 ScriptableObject?

    我最近一直在尝试统一对象池 以加快多个游戏对象的实例化速度 然而 由于这些是相当复杂的对象 我需要在它们返回池中时重置它们 我读到 使用 ScriptableObject 可能是存储默认值以便轻松重置的好方法 但为了做到这一点 我需要在运行
  • ng-selected 在选择元素中不起作用

    我有一个绑定选择
  • 通过 MailEnvelope 发送电子邮件

    我想将特定范围复制到邮件中 带图像 Sub Send Range Or Whole Worksheet with MailEnvelope Working in Excel 2002 2016 Dim AWorksheet As Works
  • 发送 ul 列表以在 django 中形成

    在模板中 我有两个连接的列表 其中一个最初是空的 用户必须从左侧列表中选择最多三个选项 将它们添加到右侧列表中 对它们进行排序 根据他 她的优先级 然后将其发回 看起来像 ul class connectedSortable li valu
  • 如何仅在 JGit 中显示远程 git 存储库的历史记录

    我只想运行git log命令来获取一些提交信息 并且不想在将远程存储库克隆到本地后执行此操作 不知道这里有没有快速的JGit方法 Git 存储库上的所有操作都是本地的 为了访问存储库的历史记录 您必须首先克隆它 如果您只对当前状态感兴趣 您
  • 模拟 Instant.now() 而不使用 Clock 进入构造函数或不使用 Clock 对象

    我的方法之一中有以下代码 ZonedDateTime current Instant now atZone ZoneId of AMERICA NEW YORK 我想嘲笑current在 JUnit 测试中 我尝试过java time Cl