使用 Spock 在 Java 中存根或模拟静态方法

Stubbing or mocking static methods in Java with Spock

是否可以使用 spock 在 java 中模拟静态方法?我知道可以模拟静态 groovy 方法,但无法让 Java 方法正常工作。

没有。为此你需要 PowerMockito。重构 class 或者将静态调用包装在受保护的方法中并将其作为间谍存根。

首先,这个问题的 best/worst 解决方案之一是 Powermock。是的,Powermock 会给你模拟静态方法的能力。你嘲笑这个方法,你的测试通过了,你完全以为你刚刚登陆月球(开玩笑)。我将是第一个承认我对这种做法 100% 有罪的人,我应该因为缺乏思考而被判重刑。

您使用 Powermock 模拟静态方法实际上完成了什么?

您正在延续一种可能已经大量存在于您正在处理的任何应用程序中的反模式。在许多负面影响中,其他开发人员会进来,查看此代码并认为可以在他们正在处理的任何用例中继续实施此解决方案。

我的看法是这样的。我从模拟静态方法开始,但感觉不对。在您开始编写测试之前,设置和配置太多。

我发现,只需创建一个助手 class,我就可以在 class 测试中使用模拟注入(取决于您的情况),方法 [=27] =] 静态实例方法所做的类型将允许我模拟该方法,从而避免 Powermock。此外,此用例中的生产代码不受影响。

到目前为止,我现在 100% 使用 Spock,但同样的原理也可以用 JUnit 实现。

如果您发现自己在应用程序中依赖 Powermock,请考虑消除这种依赖性。这是最糟糕的开源库之一,它实际上为问题提供了解决方案,但它从未针对问题的根本原因提出解决方案。