motivo: no existen instancias de tipo variable T, por lo que void se ajusta al uso de mockito

2 minutos de lectura

Quiero lanzar una excepción al ejecutar un método nulo

when(booking.validate(any())).thenThrow(BookingException.builder().build());

pero tengo un error de compilación:

Required type: T
Provided: void
reason: no instance(s) of type variable(s) T exist so that void conforms to T

Avatar de usuario de Shane Creedon
shane credo

Para vacío métodos, creo que necesitas usar el doThrow sintaxis.

Así que en tu caso sería:

doThrow(BookingException.builder().build())
      .when(booking)
      .validate(any());

  • ¡Dios, imagina los años-hombre ahorrados si este error falso simplemente proporcionara esto como una pista! Odio Java cada vez más…

    – Adam Hughes

    30 de marzo de 2021 a las 22:21

  • @AdamHughes, lamentablemente, es una falta de coincidencia en las firmas y no se puede insinuar más de lo que ya lo hace. Extracto del java-doc del método when: For stubbing void methods with throwables see: doThrow(Throwable...)

    –Valerij Dobler

    18 de marzo de 2022 a las 9:40

  • reason: no instance(s) of type variable(s) T exist so that void conforms to T podría terminar con ... did you mean doThrow() ?

    – Adam Hughes

    19 de marzo de 2022 a las 0:54

  • No lo intenté pero por su nombre no lo hice doThrow lanzamientos y excepciones? Prefiero el método M-sAnNan con doNothing().when(mockedService).sendReportingLogs(null); (responda a continuación en este momento, pero aquí está el enlace: stackoverflow.com/a/68708141/11159476).

    – gula

    1 de diciembre de 2022 a las 9:41

  • La pregunta era acerca de lanzar una excepción para una llamada de método de un simulacro. Con el debido respeto, esa respuesta no aborda eso.

    -Shane Creedon

    1 de diciembre de 2022 a las 20:01

Descubrí la sintaxis correcta.

Service mockedService = new DefaultServie();
doNothing().when(mockedService).sendReportingLogs(null);

Espero que esto responda las preguntas.

  • Esto me hizo tropezar, y esto ayudó. Gracias.

    – mojo

    20/09/2021 a las 15:53

  • bruh, esto debería estar en el documento en lugar de lo que tienen ahora

    – BabyishTank

    1 de febrero de 2022 a las 2:15

  • @BabyishTank sí claro,

    – M-sAnNan

    10 mayo 2022 a las 14:22

Solo complementando el comentario de @Shane, que fue un salvavidas pero no muy claro.

Ejemplo de cómo lanzar PersistenceException desde un método de repositorio:

doThrow(new PersistenceException())
            .when(outboxRepository)
            .delete(isA(WorkersEphemeralOutboxEntry.class));

Encuentro esto especialmente útil cuando tiene métodos sobrecargados y el compilador no puede averiguar a cuál llamar con any() y any(Class.class) le da un error de compilación.

/**
 * Use <code>doThrow()</code> when you want to stub the void method with an exception.
 * <p>
 * Stubbing voids requires different approach from {@link Mockito#when(Object)} because the compiler
 * does not like void methods inside brackets...
 * <p>
 * Example:
 *
 * <pre class="code"><code class="java">
 *   doThrow(new RuntimeException()).when(mock).someVoidMethod();
 * </code></pre>
 *
 * @param toBeThrown to be thrown when the stubbed method is called
 * @return stubber - to select a method for stubbing
 */
@CheckReturnValue
public static Stubber doThrow(Throwable... toBeThrown) {
    return MOCKITO_CORE.stubber().doThrow(toBeThrown);
}

¿Ha sido útil esta solución?