Inyeccion De Mocks De Mockito Con Spring

De Dos Ideas.
Saltar a: navegación, buscar

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