单身和单元测试

Effective Java在单元测试单例中有以下声明

将一个类作为一个单例可能会使得测试它的客户端变得困难,因为除非它实现了一个用作其类型的接口,否则不可能将一个模拟实现替换为单例。

任何人都可以解释为什么这样吗?


您可以使用反射重置您的单例对象,以防止测试互相影响。

@Before
public void resetSingleton() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
   Field instance = MySingleton.class.getDeclaredField("instance");
   instance.setAccessible(true);
   instance.set(null, null);
}

Ref:unit-testing-singletons


Mocks需要接口,因为你正在做的是用冒充者替换真正的潜在行为,冒名顶替者模仿你需要的测试。 由于客户端只处理接口引用类型,所以不需要知道实现是什么。

如果没有界面,你不能模拟一个具体的类,因为如果测试客户不知道它,你就无法取代行为。 在这种情况下,这是一个全新的课程。

对于所有类,Singleton都是如此。


我认为它实际上取决于单身访问模式的实现

例如

MySingleton.getInstance()

可能很难测试

MySingletonFactory mySingletonFactory = ...
mySingletonFactory.getInstance() //this returns a MySingleton instance or even a subclass

不提供任何关于使用单例的事实的信息。 所以你可以自由地更换你的工厂。

注意 :单例是通过在应用程序中只有一个类的实例来定义的,但是它的获取或存储方式不一定要通过静态方法。

链接地址: http://www.djcxy.com/p/78795.html

上一篇: Singleton and unit testing

下一篇: design