【问题标题】:Mocck issue with Instant.now().toString()Instant.now().toString() 的模拟问题
【发布时间】:2020-12-29 01:08:38
【问题描述】:

我已经实现了一个接口。在那里,我将时间戳作为参数传递给函数。为了获取当前时间,我使用了Instant.now().toString()

函数如下所示:

fun createId() {
    val values = Record(name = "ABC", timestamp = Instant.now().toString())
    interface_name.store(values)
}


@Test
fun `test1 for createId`() {
    val values = Record(name = "ABC", timestamp = "2020-12-28")
    every { interface_name.store(values) } just runs
}

这给了我:Verification failed,因为时间戳不同。我无法弄清楚如何模拟 Instant.now() 以便在测试时获得静态时间戳。任何帮助表示赞赏。

【问题讨论】:

  • Clock 传递给Instant#now(Clock)。在测试期间,您通过自己的Clock,在正常操作期间,您使用系统默认的Clock
  • @Slaw 你能详细说明一下吗?我在哪里打发时间?
  • 你不能在你的真实代码中使用Instant.now()。您必须让您的真实代码接受Clock - 例如在你的类的构造函数中——并将其传递给Instant.now()

标签: java unit-testing kotlin timestamp mockk


【解决方案1】:

当所有依赖项都作为参数传递时,单元测试很容易。因此,与其在函数中创建对象,不如基于抽象设计函数并将依赖项作为参数传递。

fun createId(clock: Clock = Clock.systemUTC()): Record {
    val values = Record(name = "ABC", timestamp = Instant.now(clock).toString())
    interface_name.store(values)
    return values
}


@Test
fun `test1 for createId`() {
    val clock = Clock.fixed(Instant.parse("2021-01-01T00:00:00Z"), UTC)
    val record = createId(clock)
    assertEquals(Record(name = "ABC", timestamp = "2021-01-01T00:00:00Z"), record)
}

【讨论】:

  • 感谢您的帮助。我试过这个,但嘲笑我的一个困惑是,我如何模拟 Clock.instant() 调用?
  • @PiyushDoke 你不想模拟Clock.instant() 调用。您已经使用 Clock.fixed 传递了一个“模拟”Clock
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2011-04-25
相关资源
最近更新 更多