我听说用静态方法创建对象不利于单元测试。例如,我们有以下层次结构:
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 { }
Run Code Online (Sandbox Code Playgroud)
最好使用实例 FactoryMethod 来代替。为什么使用static方法会在单元测试中带来太多痛苦?就不能有人举个例子吗?
您的方法的主要缺点是没有办法让您的班级的客户使用andBase以外的任何东西。ConcreteSuperConcrete
考虑以下示例: 和Concrete都SuperConcrete需要一些昂贵的资源来初始化(数据库连接或其他)。
使用该类的类Base将触发调用时的所有繁重工作Base.createConcrete()——因此您只能进行集成测试。
另一方面,如果create*Concrete是实例方法,您可以为客户提供一个模拟/虚拟实现,该Base实现创建轻量级“具体”实例,足以运行您的测试用例。您将能够使用 Mockito 等框架或手动创建虚拟实现。
模拟静态方法只能使用真正的侵入性工具PowerMock(如果可能的话),从而使您的测试代码变得不必要的复杂。
| 归档时间: |
|
| 查看次数: |
1228 次 |
| 最近记录: |