TurboPower LockBox 3 Unit Testing in Delphi XE2

372 Views Asked by At

I testing a class to manage Lockbox 3. I have the following pseudo mock:

unit uMockTPWDDBManager;

interface

uses inifiles,classes,UITypes,uTPLb_Codec;

type
  IPWDDBManager = interface
    ['{51C993FE-D96A-4419-AB80-00D65E16C6F8}']
  end;

  ICodec = interface
    ['{B1858F24-5B76-4468-8BD5-55684EA43CCD}']
    function GetPassword:string;
    procedure SetPassword(const c:string);
    property Password:string read GetPassword write SetPassword;
end;

  TPWDDBManager=class(TIniFile,IPWDDBManager)
  private
    FCodec1: ICodec;
    FRefCount: Integer;
  protected
    function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  public
    constructor Create(const FileName: string; Fcodec: ICodec);virtual;
    property RefCount: Integer read FRefCount;
  end;

  TMockCodec1 = class(TCodec,ICodec)
  private
    function GetPassword:string;
    procedure SetPassword(const c:string);
  end;


implementation

uses spring.container;

{ TMockCodec1 }

function TMockCodec1.GetPassword: string;
begin
  result:=Password;
end;

procedure TMockCodec1.SetPassword(const c: string);
begin
  password:=c;
end;

{ TPWDDBManager }

constructor TPWDDBManager.Create(const FileName: string; Fcodec: ICodec);
begin
  inherited create(FileName);
  FCodec1:=Fcodec;
//  FCodec1.Password:= 'ABC';
end;

function TPWDDBManager.QueryInterface(const IID: TGUID; out Obj): Integer;
const
  E_NOINTERFACE = $80004002;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TPWDDBManager._AddRef: Integer;
begin
  Inc(FRefCount);
  Result := FRefCount;
end;

function TPWDDBManager._Release: Integer;
begin
  Dec(FRefCount);
  if FRefCount = 0 then
  begin
    Destroy;
    Result := 0;
    Exit;
  end;
  Result := FRefCount;
end;

initialization
  GlobalContainer.RegisterComponent<TMockCodec1>.Implements<ICodec>;
  GlobalContainer.RegisterComponent<TPWDDBManager>.Implements<IPWDDBManager>;
end.

and the following unit test:

unit TestuTPWDDBManager;
{

  Delphi DUnit Test Case
  ----------------------
  This unit contains a skeleton test case class generated by the Test Case Wizard.
  Modify the generated code to correctly setup and call the methods from the unit
  being tested.

}

interface

uses TestFramework,uMockTPWDDBManager,IniFiles;

type
  // Test methods for class TPWDDBManager
  TestTPWDDBManager = class(TTestCase)
  strict private
    FCodec1: ICodec;
    FPWDDBManager: IPWDDBManager;
  public
    procedure SetUp; override;
  published
    procedure TestGetPWD;
  end;

implementation

uses SysUtils,Spring.container,Spring.Services;

procedure TestTPWDDBManager.SetUp;
begin
  GlobalContainer.Build;
  FCodec1:=ServiceLocator.GetService<ICodec>;
//  FCodec1:=TMockCodec1.Create(nil);
  FCodec1.Password:='a';
  FPWDDBManager :=TPWDDBManager.Create('',FCodec1);
end;


procedure TestTPWDDBManager.TestGetPWD;
begin
end;

initialization
  // Register any test cases with the test runner
  RegisterTest(TestTPWDDBManager.Suite);
end.

when I run the test I have an error message on the line FCodec1.Password:='a';

If I replace FCodec1:=ServiceLocator.GetService<ICodec>; with FCodec1:=TMockCodec1.Create(nil); then no error on FCodec1.Password:='a';

It seems the ServiceLocator didn't create the TmockCodec1 class in this case.

Where am I doing wrong ?

0

There are 0 best solutions below