如果方法A()
调用静态方法B()
,这是不好的,因为两者紧密耦合,是否正确?具体实例方法与静态方法一样不好测试,对吗?
但是,如果不是调用B()
,A()
称为某个具体类的非静态方法C()
,那么这对测试同样不好,是否正确?因为现在A()
被耦合到拥有C()
的具体类别。
当使用接口(即,依赖注入)时,唯一的好方案发生,并且A()
调用接口的方法。
我有权利吗?有没有其他原因静态方法不好测试?
如果方法A()
调用静态方法B()
,这是不好的,因为两者紧密耦合,是否正确?具体实例方法与静态方法一样不好测试,对吗?
但是,如果不是调用B()
,A()
称为某个具体类的非静态方法C()
,那么这对测试同样不好,是否正确?因为现在A()
被耦合到拥有C()
的具体类别。
当使用接口(即,依赖注入)时,唯一的好方案发生,并且A()
调用接口的方法。
我有权利吗?有没有其他原因静态方法不好测试?
第一种情况是“坏”,因为它很难交换B()
被调用。
第二种情况可能不是很糟糕,因为根据你如何获得拥有C()
的类的实例,你可能可以将该对象换成另一个(比如子类)。
第三种情况通常是“最好的”,因为它允许您更容易地更改A()
的实现,但只有在没有提供A()
的具体类的硬编码构造时才是如此(即,只有在依赖注入实际上是使用)。
这取决于语言。例如,在像Java这样的语言中调用具体类的实例方法对于测试根本没有任何坏处,因为可以生成该具体类的代理实例,从而可以有效地拦截(并且典型地嘲笑)调用。事实上,许多框架使用这个代理工具在用户代码之前/之后注入他们自己的代码,以提供依赖注入和AOP支持等功能。
谢谢澄清。 – 2011-05-16 05:08:57