何时使用 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 运算符创建对象或在测试类时使用自动连线?的主要内容,如果未能解决你的问题,请参考以下文章