为什么 Mockito 不嘲笑静态方法?

2022-08-31 05:11:56

我在这里阅读了一些关于静态方法的帖子,我想我理解滥用/过度使用静态方法可能导致的问题。但我并没有真正弄清楚为什么很难模拟静态方法。

我知道其他模拟框架,如PowerMock,可以做到这一点,但为什么Mockito不能呢?

我读了这篇文章,但作者似乎在宗教上反对这个词,也许是我的理解力差。static

一个简单的解释/链接会很棒。


答案 1

我认为原因可能是模拟对象库通常通过在运行时动态创建类(使用cglib)来创建模拟。这意味着它们要么在运行时实现一个接口(如果我没有记错的话,这就是EasyMock所做的),要么它们从类继承到模拟(如果我没有记错的话,这就是Mockito所做的)。这两种方法都不适用于静态成员,因为您无法使用继承来覆盖它们。

模拟静态的唯一方法是在运行时修改类的字节码,我认为这比继承更复杂一些。

这是我的猜测,因为它的价值...


答案 2

如果你需要模拟一个静态方法,它是一个糟糕的设计的有力指标。通常,您模拟了受测类的依赖关系。如果你的测试类引用了一个静态方法,例如java.util.Math#sin,这意味着被测类恰好需要这个实现(例如准确性与速度)。如果你想从一个具体的正弦实现中抽象出来,你可能需要一个接口(你看到它要去哪里)?


推荐