在 java 单元测试中,使用 mockito 的 dothrow() 方法可以模拟 void 方法的异常抛出。核心做法是调用 mockito.dothrow(new runtimeexception("error")).when(mockobject).voidmethod();,这样当测试代码执行到 mockobject.voidmethod() 时,就会立即抛出指定的异常。这种方法专门用于处理 void 方法,因为标准的 when(mock.method()).thenthrow() 语法在 void 方法上会报错。

为什么 void 方法不能用标准 when-then 语法?
因为 when(mock.method()) 会先执行 mock.method(),如果该方法返回 void,Java 编译器或运行时无法获取返回值来构建 OngoingStubbing 对象,导致编译错误或逻辑错误。doThrow() 采用“先定义行为,后绑定目标”的模式,避免了直接调用被 mock 的方法。

import org.mockito.Mockito;
import static org.mockito.Mockito.*;
public class ServiceTest {
public interface VoidService {
void doSomething();
}
public static void main(String[] args) {
VoidService mock = mock(VoidService.class);
// 使用 doThrow 模拟 void 方法抛出异常
doThrow(new RuntimeException("Simulated Error")).when(mock).doSomething();
try {
mock.doSomething();
} catch (RuntimeException e) {
System.out.println("Caught: " + e.getMessage());
}
}
}
如何验证异常是否被正确触发?
在测试中,通常需要将调用包裹在 try-catch 块中,或者使用 JUnit 5 的 assertThrows 来断言异常类型和消息。这样可以确保异常确实由 mock 对象抛出,而不是其他原因。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
import org.mockito.Mockito;
import static org.mockito.Mockito.*;
public class ServiceTest {
public interface VoidService {
void doSomething();
}
@Test
public void testVoidMethodThrowsException() {
VoidService mock = mock(VoidService.class);
doThrow(new RuntimeException("Simulated Error")).when(mock).doSomething();
Assertions.assertThrows(RuntimeException.class, () -> {
mock.doSomething();
});
}
}
doThrow 与 thenThrow 的区别是什么?
doThrow() 是 OngoingStubbing 接口的一部分,用于在调用方法之前定义异常行为,特别适用于 void 方法或需要避免方法实际调用的场景。thenThrow() 是 OngoingStubbing 的链式调用部分,通常与 when() 一起使用,适用于有返回值的方法。对于 void 方法,必须使用 doThrow(),否则会导致编译错误或运行时异常。

















