Diferencia entre revisiones de «EasyMock»

De Dos Ideas.
Saltar a: navegación, buscar
(Ver también)
(EasyMock 2.4: palabra "cmoparadores" cambiada por "comparadores")
 
(No se muestran 5 ediciones intermedias de 5 usuarios)
Línea 1: Línea 1:
EasyMock proporciona [[Mock Object]] para interfaces durante la [[Prueba Unitaria]] mediante la generación de estas sobre la marcha utilizando mecanismo de Proxy de Java. Debido al estilo único de registro de espectativas en EasyMock, la mayoría de [[Refactor]]'s no afectará a los objetos Mock. Así EasyMock es perfecto para [[Test Driven Development]].
+
EasyMock proporciona [[Mock Object]] para interfaces durante la [[Prueba Unitaria]] mediante la generación de estas sobre la marcha utilizando mecanismo de Proxy de Java. Debido al estilo único de registro de expectativas en EasyMock, la mayoría de [[Refactor]]'s no afectará a los objetos Mock. Así EasyMock es perfecto para [[Test Driven Development]].
  
 
[[EasyMock]] es software de código abierto disponible bajo los términos de la licencia MIT.
 
[[EasyMock]] es software de código abierto disponible bajo los términos de la licencia MIT.
Línea 13: Línea 13:
 
</code>
 
</code>
  
Tenemos así la clase PlanInvasionBoImpl que la implementa. Esta clase se comunica con un [[DAO]] para realizar la búsqueda del objeto de dominio Invasor. Luego de obtenerlo, lo convierte a un InvasorDto y lo devuelve.
+
Tenemos así la clase PlanInvasionBoImpl que la implementa. Esta clase se comunica con un [[DAO]] para realizar la búsqueda del objeto de dominio Invasor. Después de obtenerlo, lo convierte a un InvasorDto y lo devuelve.
  
 
El Dao en cuestión es de la forma:
 
El Dao en cuestión es de la forma:
Línea 24: Línea 24:
 
Usamos [[Spring Framework]] para inyectar la dependencia que tiene nuestro InvasorBoImpl con el Dao.
 
Usamos [[Spring Framework]] para inyectar la dependencia que tiene nuestro InvasorBoImpl con el Dao.
  
As, nuestra clase InvasorBoImpl queda bastante simple:
+
Asi, nuestra clase InvasorBoImpl queda bastante simple:
 
<code java>
 
<code java>
 
public class PlanInvasionBoImpl implements PlanInvasionBo {
 
public class PlanInvasionBoImpl implements PlanInvasionBo {
Línea 101: Línea 101:
 
== EasyMock 2.4 ==
 
== EasyMock 2.4 ==
 
* Se agregaron los métodos resetToNice/Default/Strict
 
* Se agregaron los métodos resetToNice/Default/Strict
* Se hicieron más flexibles los cmoparadores genéricos
+
* Se hicieron más flexibles los comparadores genéricos
 
* Los mocks son serializables
 
* Los mocks son serializables
 
* Se pueden crear mocks thread-safe
 
* Se pueden crear mocks thread-safe
Línea 108: Línea 108:
 
* [[Mockito]]
 
* [[Mockito]]
 
* [[MockEjb]]
 
* [[MockEjb]]
 +
* [[Captura De Parametros]]
 
* [[Prueba Unitaria]]
 
* [[Prueba Unitaria]]
 
* [http://www.easymock.org/ Web oficial de EasyMock]
 
* [http://www.easymock.org/ Web oficial de EasyMock]
 
* [http://today.java.net/pub/a/today/2006/06/20/getting-started-with-easymock-2.html Getting started with EasyMock2]
 
* [http://today.java.net/pub/a/today/2006/06/20/getting-started-with-easymock-2.html Getting started with EasyMock2]
* [[Captura De Parametros]]
+
 
 +
[[Category:TDD]]

Revisión actual del 00:46 14 nov 2009

EasyMock proporciona Mock Object para interfaces durante la Prueba Unitaria mediante la generación de estas sobre la marcha utilizando mecanismo de Proxy de Java. Debido al estilo único de registro de expectativas en EasyMock, la mayoría de Refactor's no afectará a los objetos Mock. Así EasyMock es perfecto para Test Driven Development.

EasyMock es software de código abierto disponible bajo los términos de la licencia MIT.

Ejemplo

El escenario

Supongamos la siguiente interfaz de negocio:

public interface PlanInvasionBo {
    public InvasorDto findInvasorById(Long id);
}

Tenemos así la clase PlanInvasionBoImpl que la implementa. Esta clase se comunica con un DAO para realizar la búsqueda del objeto de dominio Invasor. Después de obtenerlo, lo convierte a un InvasorDto y lo devuelve.

El Dao en cuestión es de la forma:

public interface PlanInvasionDao {
    public Invasor findInvasorById(Long id);
}

Usamos Spring Framework para inyectar la dependencia que tiene nuestro InvasorBoImpl con el Dao.

Asi, nuestra clase InvasorBoImpl queda bastante simple: public class PlanInvasionBoImpl implements PlanInvasionBo {

    private PlanInvasionDao planInvasionDao;
    public InvasorDto findInvasorById(Long id) {
        Invasor invasor = planInvasionDao.findInvasorById(id);
        InvasorDto invasorDto = new InvasorDto(invasor.getId(), invasor.getNombre());
        return invasorDto;
    }
    //Getters y setters de planInvasioDao a continuacion...

}

Creando el test de PlanInvasioBoImpl

Crearemos entonces un test unitario usando JUnit para nuestro método PlanInvasioBoImpl.findInvasioById().

Obviamente, no queremos testear a nuestro Dao (recordemos la definición de Prueba Unitaria!), así que deberemos crear un Mock Object para simularlo.

La creación de mocks es muy simple con EasyMock. Los pasos básicos son:

  1. Crear el mock (usualmente, en el setUp() del test
  2. "Grabarle" el comportamiento esperado
  3. Iniciar el mock (a través del método replay())
  4. Ejecutar nuestro método a testear
  5. Verificar el mock (a través del método verify())
  6. Realizar otros assert nuestros

Así, nuestro test completo quedaría:

package test.com.dosideas.mock.business.impl;
//imports varios...
import static org.easymock.EasyMock.*;
public class PlanInvasionBoImplTest extends TestCase {
    private PlanInvasionBoImpl planInvasionBo;
    private PlanInvasionDao mockDao;
    protected void setUp() throws Exception {
        mockDao = createMock(PlanInvasionDao.class);
        planInvasionBo = new PlanInvasionBoImpl();
        planInvasionBo.setPlanInvasionDao(mockDao);
    }
    public void testFindInvasorById() {
        Long id = 1L;
        Invasor invasor = new Invasor(id, "Zim");
        expect(mockDao.findInvasorById(id)).andReturn(invasor);
        replay(mockDao);
        InvasorDto resultado = planInvasionBo.findInvasorById(id);
        verify(mockDao);
        assertEquals(invasor.getId(), resultado.getId());
        assertEquals(invasor.getNombre(), resultado.getNombre());
    }
}

Y lo que ocurre es lo siguiente...

Como vemos, realizamos un import static de varios métodos de la clase EasyMock (si, necesitamos JSE 5 para la última versión de EasyMock)

En el método setUp() creamos el mock. Los mocks se crean a partir de interfaces. Así, le asignamos la dependencia a nuestro Bo a testear.

Finalmente, ya en testFindInvasionById() y antes de ejecutar el método a testear, grabamos el comportamiento que deseamos de nuestro mock. La línea "expect(....)" puede leerse como:

"Esperar que se invoque a mockDao.findInvasorById() con el parámetro id, y entonces devolver invasor".

Por último, la llamada a "verify" verifica que se las invocaciones a nuestro mock hayan ocurrido, en el orden que dijimos.

EasyMock 2.4

  • Se agregaron los métodos resetToNice/Default/Strict
  • Se hicieron más flexibles los comparadores genéricos
  • Los mocks son serializables
  • Se pueden crear mocks thread-safe

Ver también