为什么使用静态方法不适合单元测试?

时间:2015-05-30 09:15:49

标签: java unit-testing

我听说使用静态方法创建对象不利于单元测试。例如,我们有以下层次结构:

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方法会导致单元测试中的太多痛苦?不能有人举个例子吗?

1 个答案:

答案 0 :(得分:1)

您的方法的主要缺点是,无法使Base课程的客户使用除ConcreteSuperConcrete以外的任何内容。

考虑以下示例:ConcreteSuperConcrete都需要一些昂贵的资源来初始化(数据库连接或其他)。

使用Base类的类将在调用Base.createConcrete()时触发所有繁重的操作 - 因此您只能进行集成测试。

另一方面,如果create*Concrete是实例方法,您可以为您的客户端提供Base的模拟/虚拟实现,创建轻量级“具体”实例,足以运行您的测试用例。您将能够使用像Mockito这样的框架,或者只是手动创建虚拟实现。

模拟静态方法只能用于PowerMock等真正的侵入式工具(如果可能的话),从而使您的测试代码变得不必要地复杂。