单例模式之于单元测试

通常我们会看到的单例模式
public class AI {
  private static X instance = null;

  private AI() {}

  public static AI instance() {
    if (instance == null)
      instance = new AI();
    return instance;
  }

  // more methods...
}

这里我们先放过它饿不饿已经同不同步的问题。。。狠抓它对于单元测试的破坏。。。

显然我们在单元测试中是不喜欢单例模式的, 因为我们没法mock出一个单例对象。因为单例中的实例是私有的, 所以为了单元测试, 我们或许可以这么干:

public class AI  {
  static AI instance = null;

  private AI () {}

  public static AI instance() {
    if (instance == null)
      instance = new AI ();
    return instance;
  }

  // methods.
}

class TestAI {
  @Before
  public setup() {
    AI.instance = new AIMock();
  }
}

class AIMock extends AI{
    // overide methods
}

我们做了哪些改动?
很简单, 把instance改成了包可见, 这样既不会影响代码的封装性, 也满足了测试的需求。 Sounds good~.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容