überschreiben Java Final Methoden über Reflexion oder andere Mittel?

8

Diese Frage entsteht beim Versuch, Testfälle zu schreiben. Foo ist eine Klasse innerhalb der Framework-Bibliothek, auf die ich keinen Quellzugriff habe.

%Vor%

meine Anwendungen werden

%Vor%

Der Komponententest kann nicht initialisiert werden, da ich aufgrund anderer Abhängigkeiten kein Foo-Objekt erstellen kann. Der BarTest löst einen Nullzeiger aus, da der Wert null ist.

%Vor%

Kann ich reflection api verwenden, um getX () auf nicht-final zu setzen? oder wie soll ich testen?

    
zeroin23 14.04.2009, 16:25
quelle

6 Antworten

5

Sie könnten eine andere Methode erstellen, die Sie in Ihrem Test überschreiben könnten:

%Vor%

Dann könnten Sie doGetX in BarTest überschreiben.

    
james 14.04.2009, 16:56
quelle
10

Dies war eines der besten Ergebnisse für "override final method java" in Google. Ich dachte, ich würde meine Lösung verlassen. Diese Klasse zeigt eine einfache Lösung mit der Beispielklasse "Bagel" und einer frei zu benutzenden Java-Bibliothek:

%Vor%     
Curtis 16.11.2016 15:47
quelle
2

Seb ist richtig, und nur um sicherzustellen, dass Sie eine Antwort auf Ihre Frage bekommen, kurz etwas in nativem Code zu tun (und ich bin mir ziemlich sicher, dass das nicht funktionieren würde) oder den Bytecode der Klasse zur Laufzeit zu modifizieren und zu erstellen die Klasse, die die Methode zur Laufzeit überschreibt, kann ich keine Möglichkeit sehen, die "Finalität" einer Methode zu ändern. Reflektion wird dir hier nicht helfen.

    
TofuBeer 14.04.2009 16:38
quelle
0

Wenn Ihr Unit-Testfall Foo aufgrund anderer Abhängigkeiten nicht erstellen kann, könnte das ein Zeichen dafür sein, dass Sie den Unit-Test nicht von Anfang an richtig machen.

Komponententests dienen dazu, unter denselben Umständen einen Produktionscode zu testen. Daher würde ich vorschlagen, die gleiche Produktionsumgebung in Ihren Tests wiederherzustellen. Andernfalls wären Ihre Tests nicht vollständig.

    
Seb 14.04.2009 16:31
quelle
0

Wenn die von getX() zurückgegebene Variable nicht final ist, können Sie die in Was ist der beste Weg zum Unit-Testen privater Methoden? zum Ändern des Wertes der private -Variable durch Reflection .

    
Cem Catikkas 14.04.2009 18:18
quelle
0
%Vor%

Was ich letztendlich getan habe, war das obige. es ist ein bisschen hässlich ... James Lösung ist definitiv viel besser als das ...

    
zeroin23 15.04.2009 11:30
quelle

Tags und Links