Ich habe die folgende Klasse:
%Vor%Und die Testklasse:
%Vor%Wie kann ich eine Apple-Instanz als Mock in MyClass einfügen?
Sie haben 3 Möglichkeiten, dies zu lösen:
Abstrakte Fabrik : Verwenden Sie statt einer statischen Methode eine konkrete Fabrikklasse:
%Vor%Machen Sie sich in Ihrer Testklasse über die Fabrik lustig:
%Vor%PowerMock : Verwenden Sie PowerMock, um eine statische Methode zu erstellen. Schauen Sie sich meine Antwort auf eine relevante Frage an , um zu sehen, wie es gemacht wird.
Testbare Klasse : Machen Sie die Apple
-Erstellung in eine protected
-Methode eingebettet und erstellen Sie eine Testklasse, die sie überschreibt:
Natürlich sollten Sie in Ihrer Testklasse TestableMyClass
und nicht MyClass
testen.
Ich werde Ihnen meine Meinung zu jeder der Methoden sagen:
Die abstrakte Fabrikmethode ist die beste - Dies ist ein klares Design, das die Implementierungsdetails verbirgt
Die testbare Klasse - Ist die zweite Option, die minimale Änderungen erfordert
PowerMock
ist mein unbeliebter Favorit - Anstatt ein besseres Design zu wählen, ignorierst du und versteckst dein Problem. Aber das ist immer noch eine gültige Option. Bezüglich der ersten Antwort von Avi & amp; Ev0oD. Abstrakte Klassen können nur erweitert und nicht implementiert werden.
%Vor%Zusätzlich zu der von Avi vorgeschlagenen Lösung können Sie eine vierte Möglichkeit wählen:
In die Fabrik injizieren: Dies ist für mich die beste Option, wenn Sie bereits Code zum Refacrot haben. Mit dieser Lösung müssen Sie den Programmiercode nicht ändern, sondern nur die Werksklasse und den Test.
%Vor%Jetzt können Sie Ihre statische Fabrik einfach benutzen:
%Vor%