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;