You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mockito技巧:模拟方法抛出指定异常时返回指定值

嘿,我懂你想实现的效果,但这里得先澄清一个Java基础逻辑:一个方法要么抛出异常,要么返回值,这俩是互斥的——抛出异常后方法就终止了,没法再返回值。不过看你写的示例代码,我猜你大概率是想实现下面某一种需求,我分别给你对应的Mockito实现:

场景1:替代异常,直接返回0

如果你希望调用employees.calculateSalary()时,不管原本的逻辑会不会抛出ExceptionX,都直接返回0(相当于用返回值替代抛出异常的行为),那用Mockito的doReturn语法就可以:

// 先确保employees是Mockito创建的模拟对象
Employee employees = mock(Employee.class);
// 设置当调用calculateSalary()时直接返回0
doReturn(0).when(employees).calculateSalary();

这样模拟后的方法不会抛出任何异常,每次调用都会返回0。

场景2:多次调用的不同行为(先抛异常,再返回0)

如果你想实现的是第一次调用calculateSalary()时抛出ExceptionX,后续调用返回0,那可以用Mockito的连续行为配置:

// 创建模拟对象
Employee employees = mock(Employee.class);
// 配置行为:第一次抛异常,第二次及之后返回0
doThrow(ExceptionX.class).doReturn(0).when(employees).calculateSalary();

// 测试时的效果:
employees.calculateSalary(); // 第一次调用,抛出ExceptionX
int salary = employees.calculateSalary(); // 第二次调用,返回0
assertEquals(0, salary);
场景3:特定参数下返回0,其他情况抛异常

如果calculateSalary()是带参数的方法,你想仅当传入特定参数(比如这个参数原本会触发ExceptionX)时返回0,其他参数情况抛出ExceptionX,那可以结合参数匹配器来设置:

// 创建模拟对象
Employee employees = mock(Employee.class);
// 当传入参数为100时返回0
doReturn(0).when(employees).calculateSalary(eq(100));
// 其他参数情况抛出ExceptionX
doThrow(ExceptionX.class).when(employees).calculateSalary(not(eq(100)));

这样调用employees.calculateSalary(100)会返回0,调用其他参数则会抛出ExceptionX。

内容的提问来源于stack exchange,提问作者larnouch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:47:27