如何返回单例的“模拟实现”?

时间:2015-11-10 21:52:55

标签: java

EJ表示如下:

  

它不可能替换Singleton的模拟实现   除非它实现了一个充当其类型的接口。

所以,像一个类:

 public class TestSingleton implements TypeReturnable{
    public static final TestSingleton INSTANCE = new TestSingleton();
    private TestSingleton(){
    }
    public static getInstance(){
    return this.INSTANCE;
    }
}

...

public interface TypeReturnable{
TestSingleton getType();
}

或者它是否包括将类型作为参数传递给类的构造。我很困惑如何在实现作为其'类型的接口时替换实现?

2 个答案:

答案 0 :(得分:0)

提到的条件是necessary, not sufficient

为了能够模拟单身人士,您需要:

  • 使单例实现一个接口或扩展一些超类(接口更干净)
    • 由于单例具有私有构造函数,因此无法扩展单例类本身
  • 仅通过该界面使用该单例
    • 即。将它分配给变量时,该变量必须是接口类型而不是单例类型本身;调用方法时,只调用接口的方法
  • 不要在整个代码中通过静态方法(即TestSingleton.getInstance())访问单例
    • 这样的调用不能以使用mock而不是singleton的方式完成,必须用mock use替换
    • 你需要通过构造函数,参数,setter或使用依赖注入框架传递单例实例(或模拟单例时的模拟实例)

答案 1 :(得分:0)

我会写

public enum Singleton implements ISingleton {
    INSTANCE;
}

通过依赖注入传递单例。

MyTested mt = new MyTested(Singleton.INSTANCE);

然而要测试这个你可以做

ISongleton mockSingleton = createMock(ISingleton.class)
MyTested mt = new MyTested(mockSingleton);

我建议你避免

  • 可变单身(在施工期间传递可变物体)
  • 全球解决的单身人士(再次使用DI)