- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我最近读到,使类单例无法模拟类的对象,这使得测试其客户端变得困难。我无法立即理解根本原因。有人可以解释一下是什么使得无法模拟单例类吗?另外,制作单例类是否还有其他问题?
最佳答案
当然,我可以写类似 不要使用单例,它们是邪恶的,使用 Guice/Spring/whatever 但首先,这不会回答你的问题,其次,你有时 < strong>必须处理单例,例如在使用遗留代码时。
所以,我们不要讨论单例的好坏(还有一个 question),让我们看看在测试期间如何处理它们。首先,我们来看一个常见的单例实现:
public class Singleton {
private Singleton() { }
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
public String getFoo() {
return "bar";
}
}
这里有两个测试问题:
构造函数是私有(private)的,所以我们不能扩展它(我们不能控制测试中实例的创建,但是,这就是单例的意义所在)。
getInstance
是静态的,因此很难在使用单例的代码中注入(inject)伪造的而不是单例对象。
对于基于继承和多态的 mocking 框架,这两点显然都是大问题。如果您可以控制代码,一种选择是通过添加一个允许调整内部字段的 setter 使您的单例“更可测试”,如 Learn to Stop Worrying and Love the Singleton 中所述。 (在这种情况下,您甚至不需要模拟框架)。如果您不这样做,基于拦截和 AOP 概念的 现代 模拟框架可以克服前面提到的问题。
例如,Mocking Static Method Calls展示了如何使用 JMockit Expectations 模拟单例.
另一种选择是使用 PowerMock , Mockito
或 JMock
的扩展,它允许模拟通常不可模拟的东西,如静态、最终、私有(private)或构造方法。您还可以访问类的内部。
关于java - mock 单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2302179/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!