Einzelnen Beitrag anzeigen

WiPhi

Registriert seit: 19. Feb 2015
90 Beiträge
 
Delphi 11 Alexandria
 
#1

IInvokable nachträglich einem Interface hinzufügen

  Alt 3. Sep 2018, 20:30
Hallo liebe Delphianer,

Das Delphi-Mocks braucht ja zwingend Methodeninformationen ($M+) um arbeiten zu können. Nun habe ich ein Problem beim Testen diverser Klassen, welche von einem Interface abhängig sind, welches nicht von IInvokable erbt und auch keine Methodeninformationen hat.

Da das Interface fest in einem Delphi-Package verankert ist, habe ich keine Möglichkeit das noch nachträglich einzubauen. (Bzw. sollte das nur der letzte Ausweg sein. Ich suche eine elegantere Lösung , da ich diese Infos nur für die Tests brauche...)

Nun die große Frage: Bekomme ich diese Informationen irgendwie nachträglich rein?
Das Interface "abzuleiten" und für dieses die Methodenionformationen mittels $M+ hinzu zu compilieren klappt leider nicht.

Ich versuche das ganze zusätzlich noch einmal zu veranschaulichen:

Gegeben ist ein Interface, welches ich nicht ändern kann:
Delphi-Quellcode:
INichtAenderbaresInterface = interface // Hier fehlt das (IInvokable) oder $M+
  procedure MacheEtwas;
  procedure MacheEtwasAnderes;
end;
Und eine Klasse, welches dieses Interface benutzt
Delphi-Quellcode:
TEineKlasse = class
private
  FBenoetigtesInterface: INichtAenderbaresInterface;
public
  procedure IchSollGetestetWerden;
  constructor Create(const BenoetigtesInterface: INichtAenderbaresInterface);
end;

...
TEineKlasse.Create(const BenoetigtesInterface: INichtAenderbaresInterface);
begin
  FBenoetigtesInterface := BenoetigtesInterface;
end;

TEineKlasse.IchSollGetestetWerden;
begin
  // Die Funktion greift direkt auf das Interface zu
  FBenoetigtesInterface.MacheEtwas;
  // ....
  FBenoetigtesInterface.MacheEtwasAnderes;
end;
Diese Klasse funktioniert in der laufenden Applikation, jedoch nicht wenn ich sie teste und das Interface mocke. Beispielcode in DUnitX:
Delphi-Quellcode:
procedure TestFall.Teste;
var
  dummy: TMock<INichtAenderbaresInterface>;
  TesteEineKlasse: TEineKlasse;
begin
  dummy := TMock<INichtAenderbaresInterface>.Create; // <-- Hier knallt es, da keine RTTI Infos
  TesteEineKlasse := TEineKlasse.Create(dummy);
  TesteEineKlasse.IchSollGetestetWerden;
end;
Für Ideen und Ansätze bedanke ich mich schon vorab
Wer sucht, der findet. Wer länger sucht, findet mehr.
  Mit Zitat antworten Zitat