当前位置: 首页 > 面试题库 >

模拟单例课程

彭令秋
2023-03-14
问题内容

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


问题答案:

当然,我可以写一些类似 不使用单例的 东西 ,它们很邪恶,使用Guice / Spring /什么都可以,
但是首先,这不能回答您的问题,其次,当您使用遗留代码 处理单例时,例。

因此,我们不要讨论单例的优缺点(这还有另一个问题),而是让我们看看如何在测试过程中处理它们。首先,让我们看一下单例的常见实现:

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. 构造函数是私有的,因此我们不能扩展它(并且我们无法控制测试中实例的创建,但是,这就是单例的重点)。

  2. getInstance是静态的,所以很难注入假的,而不是单独的对象 使用Singleton的代码

对于基于继承和多态性的模拟框架,这两点显然都是大问题。如果您可以控制代码,一种选择是通过添加一个setter来使您的单身人士“更具可测试性”,该设置者可以按照学习停止烦恼和热爱单身人士中所述调整内部字段(您甚至不需要嘲笑框架)。如果没有,基于拦截和AOP概念的
现代 模拟框架可以克服前面提到的问题。

例如,模拟静态方法调用显示了如何使用JMockit Expectations模拟Singleton

另一种选择是使用PowerMock,它是Mockito或JMock的扩展,它允许模拟通常不可模拟的内容,例如静态,最终,私有或构造方法。您也可以访问类的内部。



 类似资料:
  • 问题内容: 我该如何与正在测试的班级中的Mockito其他班级进行模拟? 例如: MyClass.java 任何东西PerformerClass.java 并测试: 我是否可以欺骗以排除不必要的逻辑?我可以重写方法来简单地返回还是? 为什么指定Mockito,因为在Robolectric进行Android测试时需要它。 问题答案: 您可以重构,以便它使用依赖注入。不用让它创建实例,您可以将类的实例

  • 为了测试我编码的私有方法之一,我需要模拟一个单例。 用PowerMockito测试了几种方法后: 我在UtilDatabaseEnrichissement的absract父类中将配置文件定义为常量,并在构造函数中使用。 我怎么测试这部分呢?

  • 我想有一个数据库,其中包含每个学生,他/她正在参加的课程,以及他/她对每个学生的成绩。 我目前的模式是: 学生: first_name last_name student_id 课程: course_name course_id 等级 student_id course_id 问题是我不能加入学生和课程。当然可以添加student_id作为外键吗?最好的模型是什么?

  • 我试图模拟Scala单例对象。特别是,我需要模拟对象在服务组件(测试中的类)中使用。使用Mockito这是不可能的,测试执行会以以下方式失败: 在这里阅读,Scalamock似乎允许这样做: 要模拟独立的单例对象,请使用。 我的服务组件是这样的: 我的build.sbt有所有这些依赖关系: 但是我找不到这个: 也许这也可以使用EasyMock和PowerMock实现,但我找不到任何Scala示例代

  • 给定一个Kotlin单例对象和一个调用它的方法的乐趣

  • 问题内容: 在Java中创建单例类的最佳/正确方法是什么? 我发现的实现之一是使用私有构造函数和getInstance()方法。 但是在以下测试案例中实现失败吗? 如何解决呢? 谢谢 问题答案: 根据对您的问题的评论: 我有一个包含一些键值对的属性文件,这是整个应用程序所需要的,这就是为什么我在考虑单例类。 此类将从文件中加载属性并将其保留,您可以在应用程序中的任何位置使用它 不要使用单例。您显然