如果方法A()
调用静态方法B()
,这很糟糕,因为两者是紧密耦合的,对吗?
但是,如果不是调用B()
,而是A()
调用某个具体类的非静态方法C()
,那么测试同样不好,对吗?因为现在A()
与拥有C()
的具体类相关联。
当使用接口(即依赖注入)并且A()
调用接口的方法时,会发生唯一的好方案。
我说得对吗?静态方法是否有其他原因导致测试不好?
答案 0 :(得分:2)
第一种情况是“糟糕”,因为它很难交换被调用的B()
。
第二个场景可能不那么“糟糕”,因为根据你获得拥有C()
的类的实例的方式,你可能能够将该对象换成另一个(比如子类)。
第三种情况通常是“最佳”,因为它允许您更轻松地更改A()
的实现,但只有在没有提供A()
的具体类的硬编码结构时才会这样。 (即,如果依赖注入实际上是使用,则仅为tru。)
答案 1 :(得分:0)
这取决于语言。例如,在Java之类的语言中,调用具体类上的实例方法对于测试来说并不坏,因为可以生成该具体类的代理实例,从而允许有效地拦截(通常,模拟)调用。实际上,许多框架使用此代理工具在用户代码之前/之后注入自己的代码,以便提供依赖注入和AOP支持等功能。