spring4d、dunitx、および delphi-mocks を使用して、最初の単体テストの 1 つを作成しています。(spring4d リリース 1.1 - 12.09.2014)
私のテスト アプリケーションでは、テスト対象のシステム クラス (sut) へのインターフェイスを自動配線注入します。
IMyInterface = interface [{yes, a GUID here}]
  function GetSomething1: TSomething1;
  function GetSomething2: TSomething2;
end;
TMyClass = class
private
    [Inject]
    FMyInterface: IMyInterface;
    // ...
end;
今、モックで単体テストを使用しているときは、次の (非常に単純化された) コードを使用します。
TMyTest = class
private
    [Test]
    procedure Test1;
    [Test]
    procedure Test2;
    // ...
end;
procedure TMyTest.Test1;
var
    aSut: TMyClass;
    aIntfMock: TMock<IMyInterface>;
    aSomething1: TSomething1;
begin
    // Arrange
    GlobalContainer.RegisterType<TMyClass>;
    aIntfMock := TMock<IMyInterface>.Create;
    try
        GlobalContainer.RegisterType<IMyInterface>.DelegateTo(
            function: IMyInterface
            begin
                Result := aIntfMock;
            end)
            .AsDefault;
        GlobalContainer.Build;
        aSomething1 := TSomething1.Create;
        try
            aIntfMock.Setup.WillReturn(TValue.From<TSomething1>(aSomething1)).When.GetSomething1;
            aSut := GlobalContainer.Resolve<TMyClass>;
            try
                // Act
                aSut.DoSomething;
            finally
                 FreeAndNil(aSut);
            end;
            // Assert
            // ...
        finally
            FreeAndNil(aSomething1);
        end;
    finally
        aIntfMock.Free; 
    end;
end;
procedure TMyTest.Test2;
var
    aSut: TMyClass;
    aIntfMock: TMock<IMyInterface>;
    aSomething2: TSomething2;
begin
    // Arrange
    GlobalContainer.RegisterType<TMyClass>;
    aIntfMock := TMock<IMyInterface>.Create;
    try
        GlobalContainer.RegisterType<IMyInterface>.DelegateTo(
            function: IMyInterface
            begin
                Result := aIntfMock;
            end)
            .AsDefault;
        GlobalContainer.Build;   // <---- ERegistrationException here
        aSomething2 := TSomething1.Create;
        try
            aIntfMock.Setup.WillReturn(TValue.From<TSomething2>(aSomething2)).When.GetSomething2;
            aSut := GlobalContainer.Resolve<TMyClass>;
            try
                // Act
                aSut.DoSomething;
            finally
                 FreeAndNil(aSut);
            end;
            // Assert
            // ...
        finally
            FreeAndNil(aSomething2);
        end;
    finally
        aIntfMock.Free; 
    end;
end;
最初のテスト メソッド (Test1) は正常に実行されます... しかし、2 番目のテスト メソッド (Test2) では、GlobalContainer.Build の行で spring4d が例外を発生させます: ERegistrationException('Duplicate service name found: IMyInterface_u.IMyInterface@IMyInterface_u.IMyInterface' )。
aIntfMock の登録を解除して、他のすべてのテストルーチンに新しいものを登録できるようにする可能性はありますか?
[編集] したがって、解決策は次のようになります。
TMyTest = class
private
    FTestContainer: TContainer;
    FIntfMock: TMock<IMyInterface>;
    FSut: TMyClass;
    [Setup]
    procedure Setup;
    [TearDown]
    procedure TearDown;
    [Test]
    procedure Test1;
    [Test]
    procedure Test2;
    // ...
end;
//---------------------
procedure TMyTest.Setup;
begin
    FTestContainer := TContainer.Create;
    FTestContainer.RegisterType<TMyClass>;
    FIntfMock := TMock<IMyInterface>.Create;    
    FTestContainer.RegisterType<IMyInterface>.DelegateTo(
        function: IMyInterface
        begin
            Result := FIntfMock;
        end)
        .AsDefault;
    FTestContainer.Build;
    FSut := FTestContainer.Resolve<TMyClass>;
end;
procedure TMyTest.TearDown;
begin
    FreeAndNil(FSut);
    FIntfMock.Free;
    FreeAndNil(FTestContainer);
end;
procedure TMyTest.Test1;
var
    aSomething1: TSomething1;
begin
    // Arrange
    aSomething1 := TSomething1.Create;
    try
        aIntfMock.Setup.WillReturn(TValue.From<TSomething1>(aSomething1)).When.GetSomething1;
        // Act
        FSut.DoSomething;
        // Assert
        // ...
    finally
        FreeAndNil(aSomething1);
    end;
end;
procedure TMyTest.Test2;
begin
    // ...
end;
素早い回答ありがとうございます...