【问题标题】:Groovy Spock How to mock static functions from java classesGroovy Spock 如何从 java 类中模拟静态函数
【发布时间】:2021-11-26 08:03:55
【问题描述】:

我想从 Java 中模拟 Files.copy()、LocalDate.now() 等函数,例如 在我的一个功能中,我有

public int functionForTest(){
    var now = LocalDate.now()
    if(now.getMonth() == 2)
       return 55;
    if(now.getMonth() == 4)
       return 22;
}

根据当前月份,我必须返回一些值,但是当我想测试这个函数时,我必须模拟 LocalDate.now()。有人知道如何模拟这个函数吗?

【问题讨论】:

  • 您对源代码有控制权吗?重构它以获得更好的可测试性会更容易(参见例如this answer)。
  • 那么创建返回当前日期的提供者类会更好吗?如果我不能更改代码怎么办?
  • 对于这种特定情况,您不必编写类,因为已经有Clock。请参阅我的链接答案。如果您无法更改代码,我猜您很不走运。

标签: groovy mocking spock


【解决方案1】:

在 Groovy 中,您可以使用元编程模拟几乎所有内容:

import java.time.*

LocalDate.metaClass.static.now = {->
  delegate.of 2010, 5, 5
}

assert '2010-05-05' == LocalDate.now().toString()

【讨论】:

  • 在我的情况下它不起作用。它模拟 now() 方法,但仅在测试方法中而不是在我要测试的方法中
  • 它替换了 groovy 类的测试用例执行范围内的静态方法。如果你从java中调用LocalDate.now(),那么你的问题就更大了
  • 我在 java 类中使用 LocalDate.now()
  • 你有 2 个选项:1) 通过使用 Supplier 以某种方式“注入” LocalDate 并重新排列其余代码 2) 将你的 java-class 变成 groovy 并且什么都不做
  • 如果您想模拟静态 Java 方法,也可以使用 Mockito 或 Sarek 之类的附加工具。但是为了不再需要模拟静态方法而进行重构是可取的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2020-12-27
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 2019-08-29
相关资源
最近更新 更多