Автор оригинала: 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") ListmockedList = 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() { ArrayListmockedList = 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() { Listlist = 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, поэтому его кривая обучения очень мала.