为什么使用静态方法不利于单元测试?

6 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 { }
Run Code Online (Sandbox Code Playgroud)

最好使用实例 FactoryMethod 来代替。为什么使用static方法会在单元测试中带来太多痛苦?就不能有人举个例子吗?

Cos*_*atu 1

您的方法的主要缺点是没有办法让您的班级的客户使用andBase以外的任何东西。ConcreteSuperConcrete

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

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

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

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