Inyeccion De Mocks De Mockito Con Spring
Es posible inyectar a través de Static Factory Method instancias de objetos Mock de Mockito con Spring 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" />
</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.
La utilización de Mockito en forma programática sería:
...
import org.mockito.Mockito;
...
BlahDao blahDaoMock = Mockito.mock(BlahDao.class);
...
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:
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));
...
}
}