【问题标题】:How to mock static method in LocalDate using Spock?如何使用 Spock 在 LocalDate 中模拟静态方法?
【发布时间】:2020-08-31 15:31:52
【问题描述】:

我想模拟 LocalDate.now() 每次返回相同的日期。

为此,我尝试了两种不同的选择:

第一:LocalDate.now() >> LocalDate.of(2020, 05, 07)

第二:

def today = GroovyMock(LocalDate) {
                  getYear() >> 2020
                  getMonth() >> Month.APRIL
                  getDayOfMonth() >> 24
                  getDayOfWeek() >> DayOfWeek.FRIDAY
                }
    LocalDate.now(timeZone) >> today

但这对我没有帮助,LocalDate.now() 在代码中调用时仍然返回当前日期。每次向我返回模拟日期时,我如何才能实现 LocalDate.now()?

【问题讨论】:

    标签: java spock


    【解决方案1】:

    不要。 Clock 类的存在正是这个原因。在被测类中,添加一个带有 setter 的属性:

    private Clock clock = Clock.systemUTC();
    

    并使用

    LocalDate.now(clock)
    

    在您的测试用例中,将默认的“真实时钟”替换为测试时钟:

    subject.clock = Clock.fixed(specificInstant, UTC)
    

    【讨论】:

      【解决方案2】:

      没有办法使用板载工具在 Spock 中模拟 Java 类的静态方法。如果你真的想要——我同意 chrylis 的观点,你不需要——你需要使用其他工具,例如 PowerMock 或 Sarek(我自己的宠物项目之一,尚未正式发布,但在 GitHub 上可用)。

      背景:Groovy 模拟,顾名思义,仅适用于 Groovy 类。将它们与 Java 类一起使用会使它们的行为类似于常规的 Spock 模拟,即存根静态方法没有效果。这是记录在here:

      Groovy Mocks 何时应该优于常规 Mocks?当规范中的代码是用 Groovy 编写的并且需要一些独特的 Groovy 模拟功能时,应该使用 Groovy 模拟。 当从 Java 代码调用时,Groovy 模拟的行为类似于常规模拟。请注意,不必仅仅因为规范和/或模拟类型下的代码是用 Groovy 编写的,就必须使用 Groovy 模拟。除非您有具体的理由使用 Groovy 模拟,否则更喜欢常规模拟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 2010-09-14
        • 2020-02-02
        • 2022-09-25
        • 2022-06-11
        相关资源
        最近更新 更多