gpt4 book ai didi

java - mock 单例类

转载 作者:IT老高 更新时间:2023-10-28 20:30:01 27 4
gpt4 key购买 nike

我最近读到,使类单例无法模拟类的对象,这使得测试其客户端变得困难。我无法立即理解根本原因。有人可以解释一下是什么使得无法模拟单例类吗?另外,制作单例类是否还有其他问题?

最佳答案

当然,我可以写类似 不要使用单例,它们是邪恶的,使用 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";
}
}

这里有两个测试问题:

  1. 构造函数是私有(private)的,所以我们不能扩展它(我们不能控制测试中实例的创建,但是,这就是单例的意义所在)。

  2. getInstance 是静态的,因此很难在使用单例的代码中注入(inject)伪造的而不是单例对象

对于基于继承和多态的 mocking 框架,这两点显然都是大问题。如果您可以控制代码,一种选择是通过添加一个允许调整内部字段的 setter 使您的单例“更可测试”,如 Learn to Stop Worrying and Love the Singleton 中所述。 (在这种情况下,您甚至不需要模拟框架)。如果您不这样做,基于拦截和 AOP 概念的 现代 模拟框架可以克服前面提到的问题。

例如,Mocking Static Method Calls展示了如何使用 JMockit Expectations 模拟单例.

另一种选择是使用 PowerMock , MockitoJMock 的扩展,它允许模拟通常不可模拟的东西,如静态、最终、私有(private)或构造方法。您还可以访问类的内部。

关于java - mock 单例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2302179/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com