我听说使用静态方法创建对象不利于单元测试。例如,我们有以下层次结构:
public abstract class Base{
public static Base createConcrete(){
return new Concrete();
}
public static Base createSuperConcrete(){
return new SuperConcrete();
}
}
public class Concrete extends Base { }
public class SuperConcrete extends Base { }
最好使用实例FactoryMethod。为什么使用static
方法会导致单元测试中的太多痛苦?不能有人举个例子吗?
答案 0 :(得分:1)
您的方法的主要缺点是,无法使Base
课程的客户使用除Concrete
和SuperConcrete
以外的任何内容。
考虑以下示例:Concrete
和SuperConcrete
都需要一些昂贵的资源来初始化(数据库连接或其他)。
使用Base
类的类将在调用Base.createConcrete()
时触发所有繁重的操作 - 因此您只能进行集成测试。
另一方面,如果create*Concrete
是实例方法,您可以为您的客户端提供Base
的模拟/虚拟实现,创建轻量级“具体”实例,足以运行您的测试用例。您将能够使用像Mockito这样的框架,或者只是手动创建虚拟实现。
模拟静态方法只能用于PowerMock
等真正的侵入式工具(如果可能的话),从而使您的测试代码变得不必要地复杂。