Diferencia entre revisiones de «Inyeccion De Mocks De Mockito Con Spring»

De Dos Ideas.
Saltar a: navegación, buscar
(Página creada con 'Es posible inyectar a través de Method Injection instancias de objetos Mock de Mockito con Spring directamente desde el archivo de configuración. Luego, en la clase de test, …')
 
(Ejemplo)
 
(No se muestran 13 ediciones intermedias de 2 usuarios)
Línea 1: Línea 1:
Es posible inyectar a través de Method Injection instancias de objetos Mock de Mockito con Spring directamente desde el archivo de configuración.
+
Es posible inyectar a través de Static Factory Method instancias de [[Mock Object]]s de [[Mockito]] con [[Spring Framework]] directamente desde el archivo de configuración.
  
Luego, en la clase de test, pueden recuperarse con la anotación @Autowired para programarles comportamiento.
+
Luego, en la clase de test, pueden recuperarse con la anotación @Autowired para programarles comportamiento y realizar verificaciones.
 +
 
 +
==Ejemplo==
 +
 
 +
Suponiendo un [[DAO]] con interface BlahDao e implementacion BlahDaoImpl del cual se quiere inyectar una maqueta (mock) en el BO BlehBo para su test de componentes, la configuración de spring sería la siguiente:
 +
 
 +
<code xml>
 +
<beans>
 +
    ...
 +
    <bean id="dao.BlahDao" class="org.mockito.Mockito" factory-method="mock">
 +
        <constructor-arg
 +
                    type="java.lang.Class"
 +
                    value="com.dosideas.bleh.dao.impl.BlehDaoImpl" />
 +
    </bean>
 +
    ...
 +
    <bean id="business.BlehBo" class="com.dosideas.bleh.business.impl.BlehBoImpl">
 +
        <property name="blahDao" ref="dao.BlahDao"/>
 +
    </bean>
 +
    ...
 +
</code>
 +
 
 +
Hay que notar que:
 +
* En el lugar donde iría el nombre de la implementación de BlahDao, va el nombre de la clase fábrica, en este caso es la clase Mockito que crea los mocks.
 +
* El atributo factory-method indica el método de la clase fábrica capaz de devolver instancias del bean que se desea crear. En este caso el método corresponde a la clase Mockito y es el que se utiliza para crear los mocks.
 +
* Se pueden pasar argumentos al método de la fábrica. En ests caso se pasa como argumento la clase que se desea maquetar.
 +
Haciendo una simplificación del problema, lo que hace Spring a partir de esta configuración sería algo parecido a esto:
 +
 
 +
<code java>
 +
...
 +
import org.mockito.Mockito;
 +
    ...
 +
    BlahDao blahDao = Mockito.mock(BlahDao.class);
 +
    ...
 +
</code>
 +
 
 +
==Comportamiento y Verificaciones==
 +
Desde la clase de test se puede recuperar la instancia de la clase a testear, como siempre, y se puede también recuperar la clase maquetada para darle comportamiento y realizar verificaciones:
 +
 
 +
<code java>
 +
@ContextConfiguration(locations = "...")
 +
public class BlehBoComponenteTest {
 +
 
 +
    @Autowired
 +
    private BlehBo instance;
 +
 
 +
    @Autowired
 +
    private BlahDao blahDaoMock;
 +
 
 +
    @Before
 +
    public void setUp() {
 +
        //init mocks
 +
        MockitoAnnotations.initMocks(this);
 +
 
 +
        //blahDaoMock
 +
        doReturn(5)
 +
        .when(blahDaoMock)
 +
        .guardar(any(BlahEntity.class));
 +
    }
 +
 
 +
    @Test
 +
    public void test...() {
 +
        ...
 +
        verify(blahDaoMock).guardar(any(BlahEntity.class));
 +
        ...
 +
    }
 +
 
 +
}
 +
</code>
  
 
==Ver también==
 
==Ver también==
 
* [[Instanciacion De Objetos Con Spring]]
 
* [[Instanciacion De Objetos Con Spring]]
 
* [[Mockito]]
 
* [[Mockito]]
 +
* [http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-class-static-factory-method Static Factory Method en la Web oficial de Spring]
  
==Más información==
+
[[Category: TDD]]
* [http://www.springframework.org Web oficial de Spring ]
+
[[Category: Spring Framework]]

Revisión actual del 13:15 8 oct 2009

Es posible inyectar a través de Static Factory Method instancias de Mock Objects de Mockito con Spring Framework directamente desde el archivo de configuración.

Luego, en la clase de test, pueden recuperarse con la anotación @Autowired para programarles comportamiento y realizar verificaciones.

Ejemplo

Suponiendo un DAO con interface BlahDao e implementacion BlahDaoImpl del cual se quiere inyectar una maqueta (mock) en el BO BlehBo para su test de componentes, la configuración de spring sería la siguiente:

<beans>

   ...
   <bean id="dao.BlahDao" class="org.mockito.Mockito" factory-method="mock">
       <constructor-arg 
                   type="java.lang.Class" 
                   value="com.dosideas.bleh.dao.impl.BlehDaoImpl" />
   </bean>
   ...
   <bean id="business.BlehBo" class="com.dosideas.bleh.business.impl.BlehBoImpl">
       <property name="blahDao" ref="dao.BlahDao"/>
   </bean>
   ...

Hay que notar que:

  • En el lugar donde iría el nombre de la implementación de BlahDao, va el nombre de la clase fábrica, en este caso es la clase Mockito que crea los mocks.
  • El atributo factory-method indica el método de la clase fábrica capaz de devolver instancias del bean que se desea crear. En este caso el método corresponde a la clase Mockito y es el que se utiliza para crear los mocks.
  • Se pueden pasar argumentos al método de la fábrica. En ests caso se pasa como argumento la clase que se desea maquetar.

Haciendo una simplificación del problema, lo que hace Spring a partir de esta configuración sería algo parecido a esto:

... import org.mockito.Mockito;

   ...
   BlahDao blahDao = Mockito.mock(BlahDao.class);
   ...

Comportamiento y Verificaciones

Desde la clase de test se puede recuperar la instancia de la clase a testear, como siempre, y se puede también recuperar la clase maquetada para darle comportamiento y realizar verificaciones:

@ContextConfiguration(locations = "...") public class BlehBoComponenteTest {

   @Autowired
   private BlehBo instance;
   @Autowired
   private BlahDao blahDaoMock;
   @Before
   public void setUp() {
       //init mocks
       MockitoAnnotations.initMocks(this);
       //blahDaoMock
       doReturn(5)
       .when(blahDaoMock)
       .guardar(any(BlahEntity.class));
   }
   @Test
   public void test...() {
       ...
       verify(blahDaoMock).guardar(any(BlahEntity.class));
       ...
   }

}

Ver también