Delphi 如何使用Spring模拟接口';没有注册类类型的DI容器?

Delphi 如何使用Spring模拟接口';没有注册类类型的DI容器?,delphi,mocking,delphi-xe3,spring4d,Delphi,Mocking,Delphi Xe3,Spring4d,我正在尝试解耦现有代码,以便能够对其进行单元测试。我引入了接口来消除对UI对象的依赖。问题是Spring容器的RegisterComponent调用需要一个TComponentType参数,因此,我无法调用RegisterComponent,我必须调用RegisterType。Implements,这意味着我必须使用DUnit中包含progressbar类定义的单元,这违背了在需要时使用DIContainer和ServiceLocater请求progressbar的目的一个 我不想创建模拟类并手

我正在尝试解耦现有代码,以便能够对其进行单元测试。我引入了接口来消除对UI对象的依赖。问题是Spring容器的RegisterComponent调用需要一个TComponentType参数,因此,我无法调用RegisterComponent,我必须调用RegisterType。Implements,这意味着我必须使用DUnit中包含progressbar类定义的单元,这违背了在需要时使用DIContainer和ServiceLocater请求progressbar的目的一个


我不想创建模拟类并手动实现接口。有没有一种方法可以使用Delphi.Mocks自动模拟接口而不指定实现类?

您显然没有使用最新版本的Spring4D,因为该功能已于去年11月实现(请参阅中的更新)

目前还没有对容器进行自动模拟,但我喜欢这个想法,并将研究实现一些使之更容易的方法(可能通过改进容器扩展)

目前,测试用例方法如下所示(使用DSharp mocks语法):

过程TMyTestCase.TestSomething;
变量
模拟:模拟;
sut:TTestComponent;
开始
container.RegisterType;
container.RegisterType.DelegateTo(
功能:IProgressBar
开始
结果:=progressBarMock;
(完),;
容器。构建;
//模拟设置
sut:=容器。解析;
//执行测试
结束;
无论如何,我强烈建议不使用DI容器编写单元测试

如果您的SUT有许多依赖项,使得容器的使用具有吸引力,这通常是违反某些设计原则的迹象

procedure TMyTestCase.TestSomething;
var
  progressBarMock: Mock<IProgressBar>;
  sut: TTestComponent;
begin
  container.RegisterType<TTestComponent>;
  container.RegisterType<IProgressBar>.DelegateTo(
    function: IProgressBar
    begin
      Result := progressBarMock;
    end);
  container.Build;

  // mock setup

  sut := container.Resolve<TTestComponent>;

  // perform test
end;