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
相关产品推荐
相关产品推荐

