Поиск по сайту:

Метод Mockito Mock Void


В большинстве случаев метод Mockito when() достаточно хорош, чтобы имитировать поведение объекта. Но когда нам нужно имитировать метод void, мы не можем использовать when().

Метод Mockito Mock Void

Mockito предоставляет следующие методы, которые можно использовать для имитации методов void.

  1. doAnswer(): мы можем использовать это для выполнения некоторых операций, когда вызывается метод фиктивного объекта, возвращающий void.
  2. doThrow(): мы можем использовать doThrow(), когда хотим заглушить метод void, выдающий исключение.

Давайте создадим простой класс с методом void, который мы будем мокировать в наших тестовых классах.

package com.journaldev;

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 mock void

Метод Mockito doAnswer() принимает Answer в качестве аргумента. Это лямбда-выражение для его реализации.

doAnswer((i) -> {
	System.out.println("Employee setName Argument = " + i.getArgument(0));
	assertTrue("Pankaj".equals(i.getArgument(0)));
	return null;
}).when(emp).setName(anyString());

Обратите внимание, что требуется оператор return null, так как мы имитируем метод void.

Метод Mockito mock void с исключением

Ниже фрагмент кода показывает, как использовать метод doThrow() для имитации методов void с исключением.

doThrow(IllegalArgumentException.class).when(emp).setName(null);

Пример метода имитации пустоты JUnit Mockito

Вот полный пример в JUnit, где я использую Mockito для имитации метода void.

package com.journaldev.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.journaldev.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("Pankaj".equals(i.getArgument(0)));
			return null;
		}).when(emp).setName(anyString());

		when(emp.getName()).thenReturn("Pankaj");

		assertThrows(IllegalArgumentException.class, () -> emp.setName(null));

		emp.setName("Pankaj");
		assertEquals("Pankaj", emp.getName());
	}

}

Пример метода TestNG Mockito void

Поскольку аннотации 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;

Вы можете загрузить полный код проекта из нашего репозитория GitHub.