Domanda

Sto leggendo http://xunitpatterns.com/test%20stub.html e avere alcune domande sull'uso di stub, ad esempio, nel codice mostrato nella pagina l'autore crea una classe chiamata TimeProviderTestStub.java Per l'uso nel codice di prova. Ho qualche dubbio su questa riga nel codice di prova:

TimeDisplay sut = new TimeDisplay();
  //      Test Double installation
  sut.setTimeProvider(tpStub);

Ho bisogno di modificare la mia classe (SUT) per ricevere un oggetto timeProviderTestSub?

È stato utile?

Soluzione

Sia lo stub che la vera classe dovrebbero implementare un po 'di interfaccia, cioè ITimeProvider, e setTimeProvider() dovrebbe prendere questa interfaccia come parametro. L'interfaccia deve esporre tutti i metodi che il SUT deve interagire con l'oggetto poiché TimeDisplay ora può usare l'oggetto solo attraverso il ITimeProvider interfaccia (che ci consente di utilizzare uno stub anziché l'oggetto reale nei nostri test).

Nell'esempio, il SUT (TimeDisplay) sembra aver bisogno solo del getTime() metodo, quindi l'interfaccia dovrebbe contenere solo quel metodo:

public interface ITimeProvider {
    Calendar getTime();
}

La dichiarazione dello stub dovrebbe essere

public class TimeProviderTestStub implements ITimeProvider { ... }

e la dichiarazione della vera classe dovrebbe essere

public class TimeProvider implements ITimeProvider { ... }

Infine, il SUT deve cambiare il suo metodo setter per accettare l'interfaccia:

public void setTimeProvider(ITimeProvider timeProvider) { ... }

e cambia anche il suo interno timeProvider campo per essere del tipo ITimeProvider.

Se non si controlla il codice della classe reale (in modo da non poterlo implementare l'interfaccia), è possibile creare una classe di adattatore che avvolge la classe reale e implementa l'interfaccia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top