Diferencia entre revisiones de «Inyeccion De Mocks De Mockito Con Spring»
(→Ejemplo) |
|||
(No se muestran 11 ediciones intermedias de 2 usuarios) | |||
Línea 1: | Línea 1: | ||
− | Es posible inyectar a través de Static Factory Method instancias de | + | 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> | <code xml> | ||
<beans> | <beans> | ||
... | ... | ||
− | <bean id="dao.BlahDao" class="" factory-method=""> | + | <bean id="dao.BlahDao" class="org.mockito.Mockito" factory-method="mock"> |
− | <constructor-arg type="java.lang.Class" value="com.dosideas.bleh.dao" /> | + | <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> | </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> | </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> | <code java> | ||
+ | @ContextConfiguration(locations = "...") | ||
public class BlehBoComponenteTest { | public class BlehBoComponenteTest { | ||
Línea 29: | Línea 58: | ||
.when(blahDaoMock) | .when(blahDaoMock) | ||
.guardar(any(BlahEntity.class)); | .guardar(any(BlahEntity.class)); | ||
+ | } | ||
+ | |||
+ | @Test | ||
+ | public void test...() { | ||
+ | ... | ||
+ | verify(blahDaoMock).guardar(any(BlahEntity.class)); | ||
+ | ... | ||
} | } | ||
Línea 37: | Línea 73: | ||
* [[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] | ||
− | + | [[Category: TDD]] | |
− | + | [[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)); ... }
}