单身和单元测试
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