我正在尝试解耦现有代码以便能够对其进行单元测试。我引入了接口(interface)来消除对 UI 对象的依赖。问题是 Spring 容器的 RegisterComponent
我不想手动创建模拟类并实现接口(interface)。有没有办法使用Delphi.Mocks自动模拟接口(interface)而不指定实现类?
最佳答案
您显然没有使用最新版本的 Spring4D,因为此功能已于去年 11 月实现(请参阅 https://stackoverflow.com/a/11315141/587106 中的更新)
目前还没有容器的自动模拟功能,但我喜欢这个想法,并将考虑实现一些使这变得更容易的东西(可能通过改进容器扩展)。
目前测试用例方法如下所示(使用 DSharp 模拟语法):
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 有许多依赖项,使得容器的使用很有吸引力,这通常是违反某些设计原则的标志。
关于delphi - 如何在不注册类类型的情况下使用 Spring 的 DI 容器模拟接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16067655/