大多数时候,Mockito的when()
方法足以嘲笑对象的行为,但是当我们必须嘲笑一个空的方法时,我们不能使用when()
。
莫基托MockVoid方法
Mockito提供以下方法,可以用来嘲笑虚假方法。
doAnswer()
:我们可以使用它来执行某些操作,当被调用为返回 void 的模仿对象方法时doThrow()
:我们可以使用 doThrow() 当我们想要阻止一个丢弃例外的 void 方法时
让我们创建一个简单的类,使用一个空的方法,我们将在我们的测试类中开玩笑。
1package com.journaldev;
2
3public class Employee {
4
5 private String name;
6
7 public String getName() {
8 return name;
9 }
10
11 public void setName(String name) {
12 if (name == null)
13 throw new IllegalArgumentException("Employee Name can't be null");
14 this.name = name;
15 }
16
17}
Mock Mock Void 方法示例
Mockito doAnswer() 方法将Answer
作为论点,它是一个 功能界面,所以我们可以使用 lambda 表达式来实现它。
1doAnswer((i) -> {
2 System.out.println("Employee setName Argument = " + i.getArgument(0));
3 assertTrue("Pankaj".equals(i.getArgument(0)));
4 return null;
5}).when(emp).setName(anyString());
请注意,返回无效
声明是必需的,因为我们正在嘲笑无效方法。
除外的MockMockVoid方法
下面的代码片段显示了如何使用 doThrow() 方法来模仿除外的方法。
1doThrow(IllegalArgumentException.class).when(emp).setName(null);
JUnit Mockito mock void 方法示例
下面是 JUnit 中的一个完整的例子,我正在使用 Mockito 来嘲笑虚假方法。
1package com.journaldev.mockito.voidmethod;
2
3import static org.junit.jupiter.api.Assertions.assertEquals;
4import static org.junit.jupiter.api.Assertions.assertThrows;
5import static org.junit.jupiter.api.Assertions.assertTrue;
6import static org.mockito.ArgumentMatchers.anyString;
7import static org.mockito.Mockito.doAnswer;
8import static org.mockito.Mockito.doThrow;
9import static org.mockito.Mockito.mock;
10import static org.mockito.Mockito.when;
11
12import org.junit.jupiter.api.Test;
13
14import com.journaldev.Employee;
15
16class JUnitMockitoVoidMethod {
17
18 @Test
19 void test_mockito_void() {
20 Employee emp = mock(Employee.class);
21
22 doThrow(IllegalArgumentException.class).when(emp).setName(null);
23
24 doAnswer((i) -> {
25 System.out.println("Employee setName Argument = " + i.getArgument(0));
26 assertTrue("Pankaj".equals(i.getArgument(0)));
27 return null;
28 }).when(emp).setName(anyString());
29
30 when(emp.getName()).thenReturn("Pankaj");
31
32 assertThrows(IllegalArgumentException.class, () -> emp.setName(null));
33
34 emp.setName("Pankaj");
35 assertEquals("Pankaj", emp.getName());
36 }
37
38}
Mockito void 方法示例
由于 JUnit 5 和 TestNG 注释非常相似,我们不需要在上面的类别中进行任何代码特定的更改,以便从 JUnit 5 切换到 TestNG. 只需删除 JUnit 5 导入陈述并在下方添加导入以改变从 JUnit 到 TestNG 的测试框架。
1import static org.testng.Assert.assertEquals;
2import static org.testng.Assert.assertThrows;
3import static org.testng.Assert.assertTrue;
4
5import org.testng.annotations.Test;
您可以从我们的 GitHub 存储库下载完整的项目代码。