Über Verwendung von Stubs - Java
Frage
Ich lese http://xunitpatterns.com/test%20stub.html und haben einige Fragen zur Verwendung von Stubs, zum Beispiel in dem auf der Seite angegebenen Code, den der Autor eine Klasse nennt TimeProviderTestStub.java
Zur Verwendung im Testcode. Ich habe einige Zweifel an dieser Zeile im Testcode:
TimeDisplay sut = new TimeDisplay();
// Test Double installation
sut.setTimeProvider(tpStub);
Muss ich meine Klasse (SUT) ändern, um ein Objekt TimeProvidertestSub zu erhalten?
Lösung
Sowohl der Stub als auch die reale Klasse sollen eine Schnittstelle implementieren, dh ITimeProvider
, und setTimeProvider()
sollte diese Schnittstelle als Parameter nehmen. Die Schnittstelle muss alle Methoden freilegen, die die SUT mit dem Objekt interagieren muss, da TimeDisplay
kann das Objekt jetzt nur durch das verwenden ITimeProvider
Schnittstelle (die es uns ermöglicht, einen Stub anstelle des realen Objekts in unseren Tests zu verwenden).
In dem Beispiel die SUT (TimeDisplay
) scheint das nur das zu brauchen getTime()
Methode, so dass die Schnittstelle nur diese Methode enthalten sollte:
public interface ITimeProvider {
Calendar getTime();
}
Die Erklärung des Stubes sollte sein
public class TimeProviderTestStub implements ITimeProvider { ... }
und die Erklärung der realen Klasse sollte sein
public class TimeProvider implements ITimeProvider { ... }
Schließlich muss die SUT seine Settermethode ändern, um die Schnittstelle zu akzeptieren:
public void setTimeProvider(ITimeProvider timeProvider) { ... }
und auch seine interne ändern timeProvider
Feld von Typ sein ITimeProvider
.
Wenn Sie den Code der realen Klasse nicht steuern (damit Sie die Schnittstelle nicht implementieren können), können Sie eine Adapterklasse erstellen, die die reale Klasse einbindet und die Schnittstelle implementiert.