【发布时间】: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 只能使用
GroovyMock或GroovySpy模拟静态方法调用或检查 Groovy 类的交互。对于 Java 类,模拟的行为类似于普通的 Spock 模拟。如果您确实想走这条路——我敦促您不要重构,而是重构! - 您可以在 Spock 中使用 PowerMock。但是 PowerMock 的使用是 IMO 的代码气味。所以不要。去重构吧!