delphi - 如何在 Spring for Delphi 中使用带有 Autowiring 功能的模拟?

标签 delphi dependency-injection mocking ioc-container spring4d

如果我有这些接口(interface):

ISequencer = interface;
IController = interface;

它们的实现( Controller 需要通过构造函数注入(inject) Sequencer):

TSequencer = class(TInterfacedObject, ISequencer)
end;

TController = class(TInterfacedObject, IController)
  constructor Create(Sequencer: ISequencer);
end;

我在全局容器中注册实现:

GlobalContainer.RegisterType<TSequencer>.Implements<ISequencer>;
GlobalContainer.RegisterType<TController>.Implements<IController>;

GlobalContainer.Build;

最后,通过 Autowiring 功能,我可以获得 IController 接口(interface)的新实例:

Controller := ServiceLocator.GetService<IController>;

这对于真正的应用程序代码来说没问题。但在测试项目中我想模拟ISequencer。根据测试,当我向容器请求 ISequencer 的实现时,有时我需要真正的实现 (TSequencer),有时我需要模拟实现(例如 TSequencerMock)。我该如何进行此切换?

最佳答案

您可以为给定接口(interface)注册多个实现。然后你可以叫他们的名字:

GlobalContainer.RegisterType<TSequencer>.Implements<ISequencer>('real');
GlobalContainer.RegisterType<TController>.Implements<IController>('mock');

然后您可以根据需要通过名称来调用它们:

Controller := ServiceLocator.GetService<IController>('mock');

我在这里写了一篇关于如何做到这一点的文章:

http://www.nickhodges.com/post/Getting-Giddy-with-Dependency-Injection-and-Delphi-Spring-9-%E2%80%93-One-Interface-Many-Implementations.aspx

关于delphi - 如何在 Spring for Delphi 中使用带有 Autowiring 功能的模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14756493/

相关文章:

delphi - 了解 Rad Studio 中的 UTF8Encode 和 UTF8ToString

delphi - 确保嵌套子控件可见

php - Symfony2 Lazy Services 何时使用?

c# - 如何在 ASP.NET Core 中注入(inject)泛型的依赖

.net - 如何编写内部可模拟方法

java - 在 JUnit 中设置测试的成本 - 使用模拟对象与遗留代码中的存储库测试

delphi - TPaintBox 到 JPEG/BMP - 缓冲区

delphi - 如何在 Rave Reports、Delphi 7 中强制分页?

java - Spring InitializingBean 不适用于 CDI

c# - 可以使用 NSubstitute 模拟 MVC Controller 方法吗