es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con este código es que el método createMap captura la excepción lanzada por getCache y la maneja internamente. Por lo tanto, cuando usas doThrow para simular esa excepción en la llamada a getCache, es capturada por el bloque catch en createMap 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étodo removeMap se llama correctamente cuando getCache devuelve un valor no nulo.

Comments are closed.