为什么 Mockito 不嘲笑静态方法?
我在这里阅读了一些关于静态方法的帖子,我想我理解滥用/过度使用静态方法可能导致的问题。但我并没有真正弄清楚为什么很难模拟静态方法。
我知道其他模拟框架,如PowerMock,可以做到这一点,但为什么Mockito不能呢?
我读了这篇文章,但作者似乎在宗教上反对这个词,也许是我的理解力差。static
一个简单的解释/链接会很棒。
我在这里阅读了一些关于静态方法的帖子,我想我理解滥用/过度使用静态方法可能导致的问题。但我并没有真正弄清楚为什么很难模拟静态方法。
我知道其他模拟框架,如PowerMock,可以做到这一点,但为什么Mockito不能呢?
我读了这篇文章,但作者似乎在宗教上反对这个词,也许是我的理解力差。static
一个简单的解释/链接会很棒。
我认为原因可能是模拟对象库通常通过在运行时动态创建类(使用cglib)来创建模拟。这意味着它们要么在运行时实现一个接口(如果我没有记错的话,这就是EasyMock所做的),要么它们从类继承到模拟(如果我没有记错的话,这就是Mockito所做的)。这两种方法都不适用于静态成员,因为您无法使用继承来覆盖它们。
模拟静态的唯一方法是在运行时修改类的字节码,我认为这比继承更复杂一些。
这是我的猜测,因为它的价值...
如果你需要模拟一个静态方法,它是一个糟糕的设计的有力指标。通常,您模拟了受测类的依赖关系。如果你的测试类引用了一个静态方法,例如java.util.Math#sin,这意味着被测类恰好需要这个实现(例如准确性与速度)。如果你想从一个具体的正弦实现中抽象出来,你可能需要一个接口(你看到它要去哪里)?