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

Viewed 46050

I want to throw an Exception when running a void method

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

but I have a compilation error:

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

For void methods, I think you need to use the doThrow syntax.

So in your case it would be:

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

I hope this helps.

I Figured out the right syntax.

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

Hope this answers the questions

/**
 * 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);
}

Just complementing @Shane 's comment, which was a life saver but not very clear.

Example on how to throw PersistenceException from a repository method:

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

I find this especially helpful when you have overloaded methods and the compiler cannot figure out which one to call with any() and any(Class.class) gives you compiling error.

Related