Así que me han pedido que lea sobre burla y BDD para nuestro equipo de desarrollo y jugar con simulacros para mejorar algunas de nuestras pruebas unitarias existentes (como un experimento).Mockito: Mocking "Blackbox" Dependencias
En última instancia, he optado por ir con Mockito por varias razones (algunas fuera del alcance de mi control), pero es porque admite el uso de stubbing y burlas para casos en que la burla no sería apropiada.
He pasado todo el día aprendiendo sobre Mockito, burlas (en general) y BDD. Y ahora estoy listo para profundizar y comenzar a aumentar nuestras pruebas unitarias.
así que tenemos una clase llamada WebAdaptor
que tiene un método run()
:
public class WebAdaptor {
private Subscriber subscriber;
public void run() {
subscriber = new Subscriber();
subscriber.init();
}
}
Tenga en cuenta: (por razones fuera del alcance de esta pregunta) no tengo una manera de modificar el código . Así lo hago no tengo la capacidad de agregar un método setter para Subscriber
, y por lo tanto, se puede considerar como un "blackbox" inalcanzable dentro de mi WebAdaptor
.
Quiero escribir una prueba de unidad que incorpora una maqueta Mockito
, y utiliza esa maqueta a verify
que la ejecución de WebAdaptor::run()
provoca Subscriber::init()
a ser llamados.
Así que aquí es lo que tengo hasta ahora (en el interior WebAdaptorUnitTest
):
@Test
public void runShouldInvokeSubscriberInit() {
// Given
Subscriber mockSubscriber = mock(Subscriber.class);
WebAdaptor adaptor = new WebAdaptor();
// When
adaptor.run();
// Then
verify(mockSubscriber).init();
}
Cuando corro esta prueba, el Subscriber::init()
método actual es ejecutado (I puede decir de la salida de la consola y los archivos al ver que se genera en mi sistema local), no el mockSubscriber
, que no debería hacer (ni devolver) nada.
He comprobado y vuelto a inspeccionar: init
es public
, no es ni static
o final
, y vuelve void
. Según los documentos, Mockito no debería tener ningún problema para burlarse de este objeto.
Me hizo pensar: ¿necesito asociar explícitamente el mockSubscriber
con el adaptor
? Si este es el caso, entonces normalmente, la siguiente sería normalmente solucionarlo:
adaptor.setSubscriber(mockSubscriber);
Pero ya que no puedo añadir cualquier colocador (por favor leer mi nota anterior), estoy en una pérdida en cuanto a cómo podría fuerza tal asociación. Entonces, varias preguntas muy relacionadas:
- ¿Alguien puede confirmar que he configurado la prueba correctamente (usando la API de Mockito)?
- ¿Es correcta mi sospecha sobre la falta del colocador? (¿Tengo que asociar estos objetos a través de un colocador?)
- Si mi sospecha es cierta, y no puedo modificar
WebAdaptor
, ¿hay alguna posibilidad de que esté a mi disposición?
¡Gracias de antemano!
Esto no responde directamente a su pregunta, pero JMockIt que hace que este tipo de recuadro negro burlarse bastante fácil. ¿JMockIt es una opción para ti? –
¿Cómo se instancia el suscriptor en esta clase? ¿Es posible anular el código de creación de instancias para devolver una instancia que controlas? –
run() es el único método que utiliza el suscriptor, por lo tanto, debe ser una variable local dentro de ese método. De nuevo, no puedo cambiar el código ... – IAmYourFaja