Рубрики
Без рубрики

Учебник по Mockito

Учебник по Mockito, Макетные объекты Mockito, метод проверки Mockito, Шпион Mockito, метод Mockito (), аннотация Mockito @Mock, методы Mockito при возврате

Автор оригинала: Pankaj Kumar.

Mockito-это платформа для насмешек на основе java, используемая в сочетании с другими платформами тестирования, такими как JUnit и TestNG .

Он внутренне использует API отражения Java и позволяет создавать объекты сервиса. Макет объекта возвращает фиктивные данные и позволяет избежать внешних зависимостей. Это упрощает разработку тестов, высмеивая внешние зависимости и применяя насмешки в тестируемом коде.

Учебник по Mockito

В учебнике по Mockito мы будем использовать JUnit 5 и создавать некоторые сервисы для макета.

Зависимости Mockito Maven

Чтобы реализовать тестовые случаи на основе Mockito в проекте, добавьте следующую зависимость в pom.xml файл проекта:


     org.mockito
     mockito-core
     2.19.0
     test


     org.mockito
     mockito-junit-jupiter
     2.19.0
     test

Обратите внимание, что mockito-junit-jupiter требуется для JUnit 5, если вы используете любую другую платформу тестирования, такую как JUnit 4 или TestNG, вы удаляете эту зависимость и включаете только mockito-core зависимость.

Мок-Это Мок-Создание

Платформа Mockito позволяет нам создавать макетные объекты, используя либо @Mock аннотацию, либо mock() статический метод.

Метод Mockito mock()

В приведенном ниже примере показано использование метода mock():

package com.journaldev.mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import com.journaldev.AddService;
import com.journaldev.CalcService;

public class CalcService1Test {

	@Test
	void testCalc() {
		System.out.println("**--- Test testCalc executed ---**");

		AddService addService;
		CalcService calcService;

		addService = Mockito.mock(AddService.class);
		calcService = new CalcService(addService);

		int num1 = 11;
		int num2 = 12;
		int expected = 23;

		when(addService.add(num1, num2)).thenReturn(expected);

		int actual = calcService.calc(num1, num2);

		assertEquals(expected, actual);

	}
}

В приведенном выше примере мы тестируем CalcService . Метод Mockito.mock() используется для создания макетного объекта класса AddService .

Издевательски Издевательская аннотация

В приведенном ниже примере показано использование аннотации @Mock.

package com.journaldev.mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import com.journaldev.AddService;
import com.journaldev.CalcService;

public class CalcService2Test {

	CalcService calcService;

	@Mock
	AddService addService;

	@BeforeEach
	public void setup() {
		MockitoAnnotations.initMocks(this);
	}

	@Test
	public void testCalc() {
		System.out.println("**--- Test testCalc executed ---**");

		calcService = new CalcService(addService);

		int num1 = 11;
		int num2 = 12;
		int expected = 23;

		when(addService.add(num1, num2)).thenReturn(expected);

		int actual = calcService.calc(num1, num2);

		assertEquals(expected, actual);

	}
}

Обратите внимание, что нам нужно вызвать MockitoAnnotations.initMocks(это); для инициализации объектов, аннотированных @Mock, @Spy, @Captor или @InjectMocks.

Проверка поведения Mockito

Чтобы добавить поведение в издевательский класс когда() и затем используются функции Return () . Это означает, что когда макет объекта (добавить службу) вызывается для метода add с параметрами (num1, num2), он возвращает значение, сохраненное в ожидаемой переменной.

Наш класс CalcService выглядит следующим образом:

public class CalcService {
	
	private AddService addService;
	
	public CalcService(AddService addService) {
		this.addService = addService;
	}

	public int calc(int num1, int num2) {
		System.out.println("**--- CalcService calc executed ---**");
		return addService.add(num1, num2);
	}

}

CalcService зависит от класса AddService. Он использует метод add класса службы add для выполнения своей операции.

Поскольку мы хотели провести модульное тестирование только класса CalcService, мы должны имитировать экземпляр службы добавления. Услуга добавления выглядит следующим образом:

public interface AddService {
	public int add(int num1, int num2);
}
public class AddServiceImpl implements AddService {
	@Override
	public int add(int num1, int num2) {
		System.out.println("**--- AddServiceImpl add executed ---**");
		return num1 + num2;
	}
}

Mockito Проверяет взаимодействие

Платформа Mockito отслеживает все вызовы методов и их параметры для макетного объекта. Метод Mockito verify() на макете объекта проверяет, вызывается ли метод с определенными параметрами. Мы также можем указать количество логических вызовов, таких как точное количество раз, по крайней мере указанное количество раз, меньше указанного количества раз и т.д. Мы можем использовать VerificationModeFactory для логики количества вызовов.

Метод Mockito verify() проверяет, вызывается ли метод с правильными параметрами. Он не проверяет результат вызова метода, такого как метод assert. Приведенный ниже пример демонстрирует использование метода verify():

package com.journaldev.mockito;

import static org.mockito.Mockito.verify;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.mockito.internal.verification.VerificationModeFactory;

public class VerifyInteractionTest {
	@Test
	public void testMethod() {
		@SuppressWarnings("unchecked")
		List mockedList = Mockito.mock(List.class);

		mockedList.add("first-element");
		mockedList.add("second-element");
		mockedList.add("third-element");
		mockedList.add("third-element");
		mockedList.clear();

		verify(mockedList).add("first-element");
		verify(mockedList).add("second-element");
		verify(mockedList, VerificationModeFactory.times(2)).add("third-element");

		verify(mockedList).clear();
	}

}

Класс бетона-заглушки Mockito

Используя функцию when() – thenReturn (), мы можем заглушить конкретный класс/реализацию, а также один элемент коллекции. Не заглушенные элементы будут содержать в себе нуль.

package com.journaldev.mockito;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.ArrayList;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class MockSingleElementTest {
	@SuppressWarnings("unchecked")
	@Test
	public void testMethod() {
		ArrayList mockedList = mock(ArrayList.class);

		when(mockedList.get(0)).thenReturn("first-element");

		System.out.println(mockedList.get(0));
		assertEquals("first-element", mockedList.get(0));
		
		// "null" gets printed as get(1) is not stubbed
		System.out.println(mockedList.get(1));
	}

}

Насмешливый Шпион

При вызове метода твердого объекта будет вызван реальный метод, если только не было определено предопределенное поведение. Используя spy, мы можем определить поведение с помощью функций when() – theReturn() или можем вызвать реальную реализацию.

package com.journaldev.mockito;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.Test;

public class MockitoSpyTest {

	@Test
	public void testMethod() {
		List list = new ArrayList<>();
		List listSpy = spy(list);

		listSpy.add("first-element");
		System.out.println(listSpy.get(0));

		assertEquals("first-element", listSpy.get(0));
		when(listSpy.get(0)).thenReturn("second-element");
		System.out.println(listSpy.get(0));
		assertEquals("second-element", listSpy.get(0));
	}

}

Вывод

Mockito – популярная платформа для насмешек для модульного тестирования Java. Мы можем легко имитировать зависимости, используя Mockito. Стиль кодирования Mockito свободен и похож на фреймворки JUnit и TestNG, поэтому его кривая обучения очень мала.