Mockito 模拟 Void 方法

大多数时候,Mockito的when()方法足以嘲笑对象的行为,但是当我们必须嘲笑一个空的方法时,我们不能使用when()

莫基托MockVoid方法

Mockito提供以下方法,可以用来嘲笑虚假方法。

  1. doAnswer():我们可以使用它来执行某些操作,当被调用为返回 void 的模仿对象方法时
  2. 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 存储库下载完整的项目代码。

Published At
Categories with 技术
Tagged with
comments powered by Disqus