何时使用 new 运算符创建对象或在测试类时使用自动连线?

Posted

技术标签:

【中文标题】何时使用 new 运算符创建对象或在测试类时使用自动连线?【英文标题】:when to create objects using new operator or use auto-wire when testing a class? 【发布时间】:2019-01-07 02:10:14 【问题描述】:

我要测试的类名为 UserService,带有 sendEmail 方法,它向用户发送电子邮件。要完成此任务,它依赖于 EmailService。现在,当编写一个测试用例来测试这个时 - 我应该创建 UserService userService = new UserService() 并模拟电子邮件服务还是创建上下文文件在我的测试类中定义 UserService bean 和 @Autowired UserService 并模拟 EmailService?这两种方法有什么区别,什么时候应该使用另一种?

【问题讨论】:

【参考方案1】:

我会这么说

单元测试目的,您可以使用new 创建UserService 并注入模拟。在这种情况下使用 spring ioc container 不会有任何区别,只是测试会变慢,因为它们不仅会创建单个类,还会启动 spring 容器。

但是,如果您的应用程序使用spring,您还需要以某种方式对其进行测试,并且对于带有旋转弹簧上下文的集成测试方法非常有效。在这种测试中,您将测试 spring 上下文是否可以启动以及 bean 是否被正确注入。但是,通常在这种测试中,人们会尝试用假端点替换真实服务,从而相应地更改属性文件。例如。 :

向某个队列发送消息 - 在 docker 中运行您自己的队列并将其用于测试。

将一些东西保存到数据库 - 在 docker 中运行您自己的数据库或在内存中运行一个。

点击一些 HTTP 端点 - 在 docker 中运行 wiremock 并模拟任何类型的响应、模拟连接失败等。

【讨论】:

以上是关于何时使用 new 运算符创建对象或在测试类时使用自动连线?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中new运算符的实现机制及手写

javascript中new运算符

何时使用构造函数,构造函数使用new关键字

构造方法与成员方法

javascript中构造函数的说明

javascript中构造函数知识总结