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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top