原因:不存在类型变量 T 的实例,因此 void 符合使用mockito

问题描述 投票:0回答:5

我想在运行 void 方法时抛出异常

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

但是我有一个编译错误:

Required type: T
Provided: void
reason: no instance(s) of type variable(s) T exist so that void conforms to T
java spring spring-boot junit mockito
5个回答
151
投票

对于 void 方法,我认为您需要使用

doThrow
语法。

所以在你的情况下是:

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

35
投票

我找到了正确的语法。

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

希望这能回答问题


3
投票

只是补充@Shane 的评论,这是一个救星,但不是很清楚。

如何从存储库方法抛出 PersistenceException 的示例:

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

我发现当您有重载方法并且编译器无法确定使用 any() 调用哪个方法并且 any(Class.class) 会给您带来编译错误时,这特别有用。


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

0
投票

在这方面浪费了一些时间,因为该错误没有多大帮助。了解

thenThrow
适用于非 void 方法,对于 void 方法,正确的方法是使用
doThrow

所以,当你想模拟非 void 方法的异常时。

when(underTest.callNonVoidMethod()).thenThrow(new InvalidArgumentException("Error message"));

对于被测试的 void 方法,我们使用 doThrow 语法

doThrow(new InvalidArgumentException("Error message")).when(underTest).callVoidMethod();
© www.soinside.com 2019 - 2024. All rights reserved.