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

时间:2013-04-17 18:41:20

标签: delphi mocking delphi-xe3 spring4d

我正在尝试将现有代码分离,以便对其进行单元测试。我已经介绍了删除UI对象依赖的接口。问题是Spring容器的RegisterComponent< T> call需要一个TComponentType参数,所以我不能调用RegisterComponent< IMyProgressBar>我必须调用RegisterType< TMyProgressBar>。实施< IMyProgressBar>这意味着我必须在DUnit中使用包含progressbar类定义的单元,这违背了与ServiceLocater一起使用DIContainer以在需要时请求进度条的目的。

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

1 个答案:

答案 0 :(得分:3)

您显然不使用最新版本的Spring4D,因为此功能已于去年11月实施(请参阅https://stackoverflow.com/a/11315141/587106中的更新)

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

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

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有许多依赖关系,那么使用容器很有吸引力,这往往是违反某些设计原则的标志。