【问题标题】:In Spock, how do I test that a static method was called from another static method?在 Spock 中,如何测试从另一个静态方法调用的静态方法?
【发布时间】:2019-06-25 23:12:35
【问题描述】:

这是我的课:

class Application {
    public static void main(){
        System.out.println("main called");
        otherMethod();
    }

    public static void otherMethod(){
        System.out.println("otherMethod called");
    }
}

这是我的 spock 测试

def "Expect that Application.otherMethod() is called"(){
    given:
    def app = new Application() 

    when:
    Application.main()

    then:
    1 * Application.otherMethod()
}

我怎样才能做到这一点?

【问题讨论】:

  • 我喜欢 Spock 并且也使用交互测试,但它被大多数开发人员过度使用。仅仅因为你可以使用它并不意味着你应该一直。即使您可以使用静态方法做到这一点,您为什么要这样做?为什么要测试应用程序的内部布线?这样的测试有什么价值?仅当 IMO 交互对您实现的类或设计模式至关重要时,才应测试它们,例如如果您想检查观察者模式,主题发送给其注册观察者的通知实际上是否按预期发生。
  • 对您的问题的技术回答是:Spock 只能使用 GroovyMockGroovySpy 模拟静态方法调用或检查 Groovy 类的交互。对于 Java 类,模拟的行为类似于普通的 Spock 模拟。如果您确实想走这条路——我敦促您不要重构,而是重构! - 您可以在 Spock 中使用 PowerMock。但是 PowerMock 的使用是 IMO 的代码气味。所以不要。去重构吧!

标签: java groovy spock


【解决方案1】:

你没有。静态方法不应该有可见的副作用(理想情况下,它们应该是纯函数),并且对于客户端如何实现它们并不重要。

在您的简单情况下,您将对 otherMethod() 的调用移动到 Application 的构造函数中,并从您的 main 调用 new Application()

【讨论】:

  • 如果我不能使用实例怎么办?
  • @BrianJosephSpinos 你真的是在尝试测试main吗?
  • 我需要 100% 的代码覆盖率,所以是的,每个方法调用、每个分支、每一行。
  • 你的main 应该被简化为一个“启动应用程序实例”,然后你应该推回那个单一的案例。测试启动器没有意义
  • 即使我这样做,我也会测试另一个具有相同特征的类:一个具有静态方法的类,它调用另一个静态方法,我该怎么做?
猜你喜欢
  • 1970-01-01
  • 2022-11-18
  • 2010-12-24
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多