Pregunta

Estoy lectura http://xunitpatterns.com/test%20stub.html y tener algunas preguntas sobre el uso de stubs, por ejemplo, en el código que se muestra en la página que el autor crea una clase llamada TimeProviderTestStub.java Para su uso en el código de prueba. Tengo algunas dudas sobre esta línea en el código de prueba:

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

¿Necesito modificar mi clase (SUT) para recibir un objeto TimeProvidertestSub?

¿Fue útil?

Solución

Se supone que tanto el stub como la clase real implementan alguna interfaz, es decir ITimeProvider, y setTimeProvider() debe tomar esta interfaz como su parámetro. La interfaz debe exponer todos los métodos que el SUT necesita interactuar con el objeto, ya que TimeDisplay ahora solo puede usar el objeto a través del ITimeProvider interfaz (que nos permite usar un trozo en lugar del objeto real en nuestras pruebas).

En el ejemplo, el sut (TimeDisplay) parece solo necesitar el getTime() método, por lo que la interfaz solo debe contener ese método:

public interface ITimeProvider {
    Calendar getTime();
}

La declaración del trozo debe ser

public class TimeProviderTestStub implements ITimeProvider { ... }

y la declaración de la clase real debería ser

public class TimeProvider implements ITimeProvider { ... }

Finalmente, el SUT debe cambiar su método Setter para aceptar la interfaz:

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

y también cambiar su interno timeProvider campo para ser del tipo ITimeProvider.

Si no controla el código de la clase real (para que no pueda hacer que implementa la interfaz), puede crear una clase de adaptador que envuelva la clase real e implementa la interfaz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top