如果方法A()
调用静态方法B()
,这很糟糕,因为两者是紧密耦合的,对吗?
但是,如果不是调用,而是调用B()
某个具体类A()
的非静态方法C()
,这对测试同样不利,对吗?因为现在A()
耦合到拥有的具体类C()
。
唯一好的场景发生在使用接口(即依赖注入)并A()
调用接口的方法时。
我说得对吗?静态方法不利于测试还有其他原因吗?
第一种情况是“坏的”,因为它很难交换B()
被调用的内容。
第二种情况可能并不那么“糟糕”,因为根据您如何获得拥有的类的实例C()
,您可能能够将该对象交换为另一个对象(例如子类)。
A()
第三种A()
情况通常是“最好的”,因为它允许您更轻松地更改.
这取决于语言。例如,在像 Java 这样的语言中,在具体类上调用实例方法对于测试来说一点也不坏,因为可以生成该具体类的代理实例,从而可以有效地拦截调用(通常是模拟出来) . 事实上,许多框架使用这种代理工具在用户代码之前/之后注入自己的代码,以提供依赖注入和 AOP 支持等特性。