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.