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
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 condoNothing().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);
}