Mockito prueba un método vacío arroja una excepción

3 minutos de lectura

avatar de usuario
eduardmlyte

Tengo un método con un void tipo de retorno. También puede generar una serie de excepciones, por lo que me gustaría probar esas excepciones que se generan. Todos los intentos han fallado por la misma razón:

El método when(T) en el tipo Stubber no es aplicable para los argumentos (void)

¿Alguna idea de cómo puedo obtener el método para lanzar una excepción específica?

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));

  • Posible duplicado de Cómo hacer métodos simulados para anular con mockito

    – Willian

    24/07/2017 a las 20:40

avatar de usuario
JB Nizet

Los paréntesis están mal colocados.

Necesitas usar:

doThrow(new Exception()).when(mockedObject).methodReturningVoid(...);
                                          ^

y NO usar:

doThrow(new Exception()).when(mockedObject.methodReturningVoid(...));
                                                                   ^

Esto se explica en la documentación

  • @edwardmlyte Esta inconsistencia de Mockito es una de las razones por las que cambié a MoxieMocks

    – Muel

    20/10/2014 a las 17:37

  • @clement se pueden usar ambos: docs.mockito.googlecode.com/hg/latest/org/mockito/…. Crear una excepción no la arroja.

    – JB Nizet

    23 de julio de 2015 a las 15:27


  • @JB Nizet Estoy totalmente de acuerdo con usted, pero sin embargo, si escribo doThrow (nueva excepción ()) en lugar de doThrow (Exception.class), tengo el siguiente error cuando inicio mi prueba; Se esperaba la excepción com.company.project.exception.ElementNotFoundException pero se obtuvo org.mockito.exceptions.base.MockitoException:

    – clemente

    24 de julio de 2015 a las 8:21


  • Haga otra pregunta, con el código bajo prueba, el código de la prueba y el seguimiento completo de la pila de la excepción.

    – JB Nizet

    24 de julio de 2015 a las 9:17

  • doThrow(nueva excepción()).when(objeto).voidMethod(any());

    – Soumyajit Swain

    18 de noviembre de 2016 a las 6:38

avatar de usuario
ondrej burkert

Si alguna vez te preguntaste cómo hacerlo usando el nuevo estilo BDD de Mockito:

willThrow(new Exception()).given(mockedObject).methodReturningVoid(...));

Y para referencia futura, es posible que deba lanzar una excepción y luego no hacer nada:

willThrow(new Exception()).willDoNothing().given(mockedObject).methodReturningVoid(...));

  • Gracias por publicar esto aquí; si el método devuelve un valor: dado(mockedObject.methodReturningAnObject()).willThrow(new Exception()); si el método no devuelve nada: willThrow(new Exception()).given(mockedObject).methodReturningVoid(…)); Formulario de explicación javadoc: “Stubbing voids requiere un enfoque diferente de {@link Mockito#when(Object)} (o BDDMockito.given) porque al compilador no le gustan los métodos void entre paréntesis…”

    – Lobo359

    17 de diciembre de 2018 a las 7:55


avatar de usuario
ayushi

Puedes probar algo como lo siguiente:

 given(class.method()).willAnswer(invocation -> {
          throw new ExceptionClassName();
        });
    

En mi caso, quería lanzar una excepción explícita para un bloque de prueba, mi bloque de método era algo como el siguiente

     public boolean methodName(param) throws SomeException{
    
        try(FileOutputStream out = new FileOutputStream(param.getOutputFile())) {
          //some implementation
        } catch (IOException ioException) {
          throw new SomeException(ioException.getMessage());
        } catch (SomeException someException) {
          throw new SomeException (someException.getMessage());
        } catch (SomeOtherException someOtherException) {
          throw new SomeException (someOtherException.getMessage());
        }
        return true;
      }

He cubierto todas las excepciones anteriores para la cobertura de sonar como a continuación

   given(new FileOutputStream(fileInfo.getOutputFile())).willAnswer(invocation -> {
      throw new IOException();
    });
    Assertions.assertThrows(SomeException.class, () ->
    {
      ClassName.methodName(param);
    });

  • given(class.method()) da el mismo error. Su methodName devuelve un booleano, mientras que OP lo requería explícitamente para devolver vacío

    – Cristian Traina

    3 de junio a las 12:42


¿Ha sido útil esta solución?