如何在不注册类类型的情况下模拟带有 Spring 的 DI 容器的接口?



我正试图解耦现有的代码,以便能够进行单元测试。我引入了接口来消除对UI对象的依赖。问题是Spring容器的RegisterComponent <调用需要一个TComponentType参数,所以我不能调用RegisterComponent><我必须调用RegisterType>。实现& lt;这意味着我必须在DUnit中使用包含进度条类定义的单元,这违背了使用diccontainer与ServiceLocater一起使用的目的,以便在需要时请求进度条。

我不想创建模拟类并手动实现接口。有没有办法使用Delphi。模拟自动模拟接口而不指定实现类?

您显然没有使用最新版本的Spring4D,因为该功能已于去年11月实现(参见https://stackoverflow.com/a/11315141/587106的更新)

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

目前,测试用例方法看起来像这样(使用DSharp mock语法):

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;

无论如何,我强烈建议不要使用DI容器来编写单元测试。

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

最新更新