Mockito模拟无效方法
时间:2020-02-23 14:40:45 来源:igfitidea点击:
大多数时候,Mockito的" when()"方法足以模拟对象的行为。
但是,当我们必须模拟void方法时,就不能使用when()。
Mockito模拟无效方法
Mockito提供了以下可用于模拟void方法的方法。
doAnswer():当被调用的模拟对象方法返回void时,我们可以使用它执行一些操作。doThrow():当我们想存根一个抛出异常的void方法时,可以使用doThrow()。
让我们创建一个带有void方法的简单类,该类将在测试类中进行模拟。
package com.theitroad;
public class Employee {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
if (name == null)
throw new IllegalArgumentException("Employee Name can't be null");
this.name = name;
}
}
Mockito模拟无效方法示例
Mockito doAnswer()方法将" Answer"作为参数。
这是一个功能性的接口,因此我们可以使用lambda表达式进行实现。
doAnswer((i) -> {
System.out.println("Employee setName Argument = " + i.getArgument(0));
assertTrue("hyman".equals(i.getArgument(0)));
return null;
}).when(emp).setName(anyString());
注意,因为我们在模拟void方法,所以需要return null语句。
Mockito模拟无效方法与异常
下面的代码片段显示了如何使用doThrow()方法来模拟带有异常的void方法。
doThrow(IllegalArgumentException.class).when(emp).setName(null);
JUnit Mockito模拟void方法示例
这是我使用Mockito模拟void方法的JUnit中的完整示例。
package com.theitroad.mockito.voidmethod;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.jupiter.api.Test;
import com.theitroad.Employee;
class JUnitMockitoVoidMethod {
@Test
void test_mockito_void() {
Employee emp = mock(Employee.class);
doThrow(IllegalArgumentException.class).when(emp).setName(null);
doAnswer((i) -> {
System.out.println("Employee setName Argument = " + i.getArgument(0));
assertTrue("hyman".equals(i.getArgument(0)));
return null;
}).when(emp).setName(anyString());
when(emp.getName()).thenReturn("hyman");
assertThrows(IllegalArgumentException.class, () -> emp.setName(null));
emp.setName("hyman");
assertEquals("hyman", emp.getName());
}
}
TestNG Mockito无效方法示例
由于JUnit 5和TestNG批注是如此相似,因此我们无需在上述类中进行任何代码特定的更改即可从JUnit 5切换到TestNG。
只需删除JUnit 5导入语句并添加以下导入即可将测试框架从JUnit更改为TestNG。
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertThrows; import static org.testng.Assert.assertTrue; import org.testng.annotations.Test;

