La prueba del bloque catch utilizando mockito doThrow se ejecuta de inmediato.
Quiero probar el bloque catch de mi método utilizando Mockito. Como muestra el siguiente ejemplo, uso Mockito.doThrow donde quiero que ocurra la excepción. Luego llamo al método que incluye esta llamada. Pero esta línea nunca se ejecuta porque en la línea de doThrow, la excepción se lanza inmediatamente. Espero que se lance cuando llame a la siguiente línea (spyDataGridService.createMap(mapName)).
¿Qué está mal con ello?
@Override
public String createMap(String mapName) {
String result;
try {
RemoteCache remoteCache = remoteCacheManager.getCache(mapName);
if(remoteCache != null) {
removeMap(mapName);
}
remoteCacheManager.administration().createCache(mapName, new XMLStringConfiguration(String.format("<distributed-cache name="\"%s\"" mode="\"SYNC\"" statistics="\"true\""><encoding media-type="\"text/plain\"/"><memory><object size="\"2000000\"/"></object></memory><expiration lifespan="\"3600000\"/"><state-transfer timeout="\"3600000\"/"></state-transfer></expiration></encoding></distributed-cache>", mapName)));
dataGridBeanConfiguration.getConfigurationBuilder().build();
result = String.format("Map: '%s', se ha creado el mapa.", mapName);
logger.info(result);
} catch (Exception e) {
result = String.format("Map: '%s', error al crear el mapa: %s", mapName, e.getMessage());
logger.error(result);
}
return result;
}
@Test(expected = Exception.class)
public void testCreateMapException() {
RemoteCacheManager mockRemoteCacheManager = Mockito.mock(RemoteCacheManager.class);
DataGridBeanConfiguration mockDataGridBeanConfiguration = Mockito.mock(DataGridBeanConfiguration.class);
DataGridService spyDataGridService = Mockito.spy(new DataGridServiceImpl(mockRemoteCacheManager, mockDataGridBeanConfiguration));
Mockito.doThrow(Exception.class).when(mockRemoteCacheManager).getCache(Mockito.anyString());
spyDataGridService.createMap(mapName);
}
davy.ai
El problema con este código es que el método
createMap
captura la excepción lanzada porgetCache
y la maneja internamente. Por lo tanto, cuando usasdoThrow
para simular esa excepción en la llamada agetCache
, es capturada por el bloque catch encreateMap
y la prueba no falla como se espera.Para solucionar esto, podrías refactorizar el código para eliminar el bloque try-catch y permitir que la excepción se propague hasta el método de prueba. Luego, puedes usar el bloque try-catch en el método de prueba para capturar la excepción y realizar una afirmación en su mensaje.
Alternativamente, podrías usar el método
doAnswer
de Mockito para simular el comportamiento real del método en lugar de lanzar una excepción. Esto te permitiría probar que el métodoremoveMap
se llama correctamente cuandogetCache
devuelve un valor no nulo.