18. Plan TDD Dobles de prueba Un doble de prueba es un objeto que no es el real y que usamos para poder probar una funcionalidad aislándonos del resto de los objetos del sistema ¿Qué son los doble de prueba?
19.
20.
21. Plan TDD Dobles de prueba Un stub es un objeto que programamos para que nos devuelva lo que nos de la gana y poder probar cómo reacciona nuestro código ante los distintos valores de respuesta del colaborador en cuestión Stubs
22. Plan TDD Dobles de prueba Ejemplo de stub (usando mockito) public class CompraTest { Producto unProductoStub = mock (Producto.class); Producto otroProductoStub = mock (Producto.class); PasarelaDePago pasarelaDePagoStub = mock (PasarelaDePago.class); Compra compra = new Compra(pasarelaDePagoStub); @Test public void si_el_cliente_tiene_fondos_para_realizar_la_compra_la_puedo_confirmar() { when (unProductoStub.precio()). thenReturn (50); when (otroProductoStub.precio()). thenReturn (25); when (pasarelaDePagoStub.tieneElUsuarioFondosPorValorDe(75)). thenReturn (true); compra.anadir(unProductoStub); compra.anadir(otroProductoStub); assertTrue(compra.confirmar()); } }
23.
24. Plan TDD Dobles de prueba Mocks Un mock es un doble que nos sirve para verificar salidas indirectas del objeto que estamos probando
25. Plan TDD Dobles de prueba Ejemplo de mock (usando easyMock) public class CompraTestMocks { PasarelaDePago pasarelaDePagoMock = createMock(PasarelaDePago.class); Producto unProductoStub = createMock(Producto.class); Compra compra = new Compra(pasarelaDePagoMock); @Test public void si_el_cliente_tiene_fondos_para_realizar_la_compra_tengo_que_cobrarle_a_traves_de_la_pasarela_de_pago() { expect (unProductoStub.precio()). andReturn (50); expect (pasarelaDePagoMock.tieneElUsuarioFondosPorValorDe(50)). andReturn (true); pasarelaDePagoMock.cobrar(50); replay (pasarelaDePagoMock); replay (unProductoStub); compra.anadir(unProductoStub); compra.confirmar(); verify (pasarelaDePagoMock); } }
26. Plan TDD boolean confirmar() { int elPrecioDeLaCompra = precio(); boolean tieneElUsuarioFondos = pasarelaDePago.tieneElUsuarioFondosPorValorDe(elPrecioDeLaCompra); if (tieneElUsuarioFondos){ pasarelaDePago.cobrar(elPrecioDeLaCompra); } return tieneElUsuarioFondos; } Dobles de prueba
27. Plan TDD Dobles de prueba Spies Al igual que los mocks , los spies sirven para hacer comprobaciones sobre salidas indirectas. La diferencia es que con un Spy lo que hacemos es después de ejecutar el método a probar verificar si sobre el doble se ha invocado a tal o cual método
28. Plan TDD Dobles de prueba Ejemplo de Spy (usando mockito) public class CompraTestSpies { PasarelaDePago pasarelaDePagoSpy = mock (PasarelaDePago.class); Producto unProductoStub = mock (Producto.class); Compra compra = new Compra(pasarelaDePagoSpy); @Test public void si_el_cliente_tiene_fondos_para_realizar_la_compra_tengo_que_cobrarle_a_traves_de_la_pasarela_de_pago() { when (unProductoStub.precio()). thenReturn (50); when (pasarelaDePagoSpy.tieneElUsuarioFondosPorValorDe(50)). thenReturn (false); compra.anadir(unProductoStub); compra.confirmar(); verify (pasarelaDePagoSpy).cobrar(50); } }
30. Plan TDD Dobles de prueba Fakes Un fake es una implementación falsa de un determinado interfaz, más simple normalmente, con el objetivo de hacer que el test se pueda ejecutar más rápido o sin dependencias de un sistema externo. Por ejemplo un fake de un objeto que acceda a la persistencia podría ser una implementación en memoria del mismo objeto.
31. Plan TDD Dobles de prueba Dummy Un dummy es simplemente cuando el objeto a probar tiene algún colaborador que no vamos a utilizar en este test, entonces se le pasa un dummy que puede ser simplemente un nulo
32. Plan TDD Webs de referencia Mock Sucks http://www.testingtv.com/2010/12/20/mocks-suck-and-what-to-do-about-it/ Java Mock Frameworks Comparison http://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html Diferencias entre mocks y stubs http://theproc.es/2009/5/21/658/diferencias-entre-mocks-y-stubs Escribiendo mejores tests http://weblogs.javahispano.org/artesanodeprimera/entry/escribiendo_mejores_test_iii_mocking Dobles de prueba