我正试图解耦现有的代码,以便能够进行单元测试。我引入了接口来消除对UI对象的依赖。问题是Spring容器的RegisterComponent <调用需要一个TComponentType参数,所以我不能调用RegisterComponent><我必须调用RegisterType>
我不想创建模拟类并手动实现接口。有没有办法使用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有许多依赖项,使得容器的使用具有吸引力,这通常是违反某些设计原则的标志。