Мокито — Обзор
Пересмешка — это способ проверить функциональность класса в отдельности. Для проверки работоспособности не требуется подключение к базе данных или чтение файла свойств или чтение файлового сервера. Поддельные объекты делают насмешку над реальным сервисом. Макет объекта возвращает фиктивные данные, соответствующие некоторому фиктивному вводу, переданному ему.
Mockito
Mockito облегчает создание ложных объектов. Он использует Java Reflection для создания фиктивных объектов для данного интерфейса. Поддельные объекты — не что иное, как прокси для реальных реализаций.
Рассмотрим случай с Stock Service, который возвращает информацию о цене акции. Во время разработки фактическая служба запаса не может быть использована для получения данных в реальном времени. Итак, нам нужна фиктивная реализация стокового сервиса. Mockito может сделать то же самое очень легко, как предполагает его название.
Преимущества Мокито
-
Нет рукописного ввода — не нужно писать фиктивные объекты самостоятельно.
-
Рефакторинг Safe — переименование имен методов интерфейса или изменение порядка параметров не нарушит тестовый код, так как Mocks создаются во время выполнения.
-
Поддержка возвращаемых значений — Поддерживает возвращаемые значения.
-
Поддержка исключений — Поддерживает исключения.
-
Поддержка проверки заказа — Поддерживает проверку порядка вызовов методов.
-
Поддержка аннотаций — Поддерживает создание макетов с использованием аннотаций.
Нет рукописного ввода — не нужно писать фиктивные объекты самостоятельно.
Рефакторинг Safe — переименование имен методов интерфейса или изменение порядка параметров не нарушит тестовый код, так как Mocks создаются во время выполнения.
Поддержка возвращаемых значений — Поддерживает возвращаемые значения.
Поддержка исключений — Поддерживает исключения.
Поддержка проверки заказа — Поддерживает проверку порядка вызовов методов.
Поддержка аннотаций — Поддерживает создание макетов с использованием аннотаций.
Рассмотрим следующий фрагмент кода.
package com.tutorialspoint.mock; import java.util.ArrayList; import java.util.List; import static org.mockito.Mockito.*; public class PortfolioTester { public static void main(String[] args){ //Create a portfolio object which is to be tested Portfolio portfolio = new Portfolio(); //Creates a list of stocks to be added to the portfolio List<Stock> stocks = new ArrayList<Stock>(); Stock googleStock = new Stock("1","Google", 10); Stock microsoftStock = new Stock("2","Microsoft",100); stocks.add(googleStock); stocks.add(microsoftStock); //Create the mock object of stock service StockService stockServiceMock = mock(StockService.class); // mock the behavior of stock service to return the value of various stocks when(stockServiceMock.getPrice(googleStock)).thenReturn(50.00); when(stockServiceMock.getPrice(microsoftStock)).thenReturn(1000.00); //add stocks to the portfolio portfolio.setStocks(stocks); //set the stockService to the portfolio portfolio.setStockService(stockServiceMock); double marketValue = portfolio.getMarketValue(); //verify the market value to be //10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500 System.out.println("Market value of the portfolio: "+ marketValue); } }
Давайте разберемся с важными концепциями вышеуказанной программы. Полный код доступен в главе Первое применение .
-
Портфолио — объект для хранения списка акций и получения рыночной стоимости, рассчитанной с использованием цен акций и количества акций.
-
Запас — объект для переноса деталей запаса, таких как его идентификатор, имя, количество и т. Д.
-
StockService — Служба акций возвращает текущую цену акций.
-
mock (…) — Mockito создал макет стокового сервиса.
-
when (…). thenReturn (…) — Ложная реализация метода getPrice интерфейса stockService. Для googleStock верните 50,00 в качестве цены.
-
portfolio.setStocks (…) — Портфель теперь содержит список из двух акций.
-
portfolio.setStockService (…) — Назначает объект-макет stockService портфелю.
-
portfolio.getMarketValue () — Портфель возвращает рыночную стоимость, основанную на его акциях, используя сервис фиктивной акции.
Портфолио — объект для хранения списка акций и получения рыночной стоимости, рассчитанной с использованием цен акций и количества акций.
Запас — объект для переноса деталей запаса, таких как его идентификатор, имя, количество и т. Д.
StockService — Служба акций возвращает текущую цену акций.
mock (…) — Mockito создал макет стокового сервиса.
when (…). thenReturn (…) — Ложная реализация метода getPrice интерфейса stockService. Для googleStock верните 50,00 в качестве цены.
portfolio.setStocks (…) — Портфель теперь содержит список из двух акций.
portfolio.setStockService (…) — Назначает объект-макет stockService портфелю.
portfolio.getMarketValue () — Портфель возвращает рыночную стоимость, основанную на его акциях, используя сервис фиктивной акции.
Mockito — настройка среды
Mockito — это фреймворк для Java, поэтому самое первое требование — установить JDK на ваш компьютер.
Системные требования
JDK | 1,5 или выше. |
---|---|
объем памяти | нет минимальных требований. |
Дисковое пространство | нет минимальных требований. |
Операционная система | нет минимальных требований. |
Шаг 1. Проверка установки Java на вашем компьютере.
Откройте консоль и выполните следующую команду Java .
Операционные системы | задача | команда |
---|---|---|
Windows | Открытая командная консоль | c: \> Java-версия |
Linux | Открытый командный терминал | $ java-версия |
макинтош | Открытый терминал | машина:> Джозеф $ Java-версия |
Давайте проверим вывод для всех операционных систем —
Операционные системы | Выход |
---|---|
Windows |
Java-версия «1.6.0_21» Java (TM) SE Runtime Environment (сборка 1.6.0_21-b07) Клиентская виртуальная машина Java HotSpot (TM) (сборка 17.0-b17, смешанный режим, совместное использование) |
Linux |
Java-версия «1.6.0_21» Java (TM) SE Runtime Environment (сборка 1.6.0_21-b07) Клиентская виртуальная машина Java HotSpot (TM) (сборка 17.0-b17, смешанный режим, совместное использование) |
макинтош |
Java-версия «1.6.0_21» Java (TM) SE Runtime Environment (сборка 1.6.0_21-b07) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 17.0-b17, смешанный режим, совместное использование) |
Java-версия «1.6.0_21»
Java (TM) SE Runtime Environment (сборка 1.6.0_21-b07)
Клиентская виртуальная машина Java HotSpot (TM) (сборка 17.0-b17, смешанный режим, совместное использование)
Java-версия «1.6.0_21»
Java (TM) SE Runtime Environment (сборка 1.6.0_21-b07)
Клиентская виртуальная машина Java HotSpot (TM) (сборка 17.0-b17, смешанный режим, совместное использование)
Java-версия «1.6.0_21»
Java (TM) SE Runtime Environment (сборка 1.6.0_21-b07)
Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 17.0-b17, смешанный режим, совместное использование)
Если у вас не установлена Java, для установки Java Software Development Kit (SDK) нажмите здесь.
Мы предполагаем, что для этого урока в вашей системе установлена Java 1.6.0_21.
Шаг 2 — Установите среду JAVA
Установите переменную среды JAVA_HOME, чтобы она указывала на местоположение базовой директории, где установлена Java на вашем компьютере. Например,
Операционные системы | Выход |
---|---|
Windows | Задайте для переменной среды JAVA_HOME значение C: \ Program Files \ Java \ jdk1.6.0_21. |
Linux | экспорт JAVA_HOME = / usr / local / java-current |
макинтош | export JAVA_HOME = / Библиотека / Java / Главная |
Добавьте местоположение компилятора Java в системный путь.
Операционные системы | Выход |
---|---|
Windows | Добавьте строку; C: \ Program Files \ Java \ jdk1.6.0_21 \ bin в конец системной переменной Path. |
Linux | экспорт PATH = $ PATH: $ JAVA_HOME / bin / |
макинтош | не требуется |
Проверьте установку Java с помощью команды java -version, как описано выше.
Шаг 3 — Загрузить архив Mockito-All
Чтобы загрузить последнюю версию Mockito из репозитория Maven, нажмите здесь.
Сохраните файл jar на диске C, скажем, C: \> Mockito.
Операционные системы | Название архива |
---|---|
Windows | Mockito-все-2.0.2-beta.jar |
Linux | Mockito-все-2.0.2-beta.jar |
макинтош | Mockito-все-2.0.2-beta.jar |
Шаг 4 — Установите Mockito Environment
Задайте переменную среды Mockito_HOME, чтобы она указывала на базовую папку, в которой хранятся файлы Mockito и jar зависимостей на вашем компьютере. В следующей таблице показано, как установить переменную среды в разных операционных системах, предполагая, что мы распаковали mockito-all-2.0.2-beta.jar в папку C: \> Mockito.
Операционные системы | Выход |
---|---|
Windows | Установите переменную окружения Mockito_HOME в C: \ Mockito |
Linux | export Mockito_HOME = / usr / local / Mockito |
макинтош | export Mockito_HOME = / Библиотека / Mockito |
Шаг 5 — Установите переменную CLASSPATH
Задайте переменную среды CLASSPATH, чтобы указать место, где хранится баночка Mockito. В следующей таблице показано, как установить переменную CLASSPATH в разных операционных системах.
Операционные системы | Выход |
---|---|
Windows | Установите для переменной среды CLASSPATH значение% CLASSPATH%;% Mockito_HOME% \ mockito-all-2.0.2-beta.jar;.; |
Linux | export CLASSPATH = $ CLASSPATH: $ Mockito_HOME / mockito-all-2.0.2-beta.jar :. |
макинтош | export CLASSPATH = $ CLASSPATH: $ Mockito_HOME / mockito-all-2.0.2-beta.jar :. |
Шаг 6 — Скачать архив JUnit
Загрузите последнюю версию JAR-файла JUnit с Github . Сохраните папку в папке C: \> Junit.
Операционные системы | Название архива |
---|---|
Windows | junit4.11.jar, hamcrest-core-1.2.1.jar |
Linux | junit4.11.jar, hamcrest-core-1.2.1.jar |
макинтош | junit4.11.jar, hamcrest-core-1.2.1.jar |
Шаг 7 — Установите JUnit Environment
Установите переменную среды JUNIT_HOME, чтобы она указывала на местоположение базовой директории, где хранятся файлы JUnit на вашем компьютере. В следующей таблице показано, как установить эту переменную среды в разных операционных системах, при условии, что мы сохранили junit4.11.jar и hamcrest-core-1.2.1.jar в C: \> Junit.
Операционные системы | Выход |
---|---|
Windows | Установите переменную окружения JUNIT_HOME в C: \ JUNIT |
Linux | экспорт JUNIT_HOME = / usr / local / JUNIT |
макинтош | экспорт JUNIT_HOME = / Библиотека / JUNIT |
Шаг 8 — Установите переменную CLASSPATH
Установите переменную среды CLASSPATH, чтобы она указывала на расположение JAR JAR. В следующей таблице показано, как это делается в разных операционных системах.
Операционные системы | Выход |
---|---|
Windows | Установите для переменной среды CLASSPATH значение% CLASSPATH%;% JUNIT_HOME% \ junit4.11.jar;% JUNIT_HOME% \ hamcrest-core-1.2.1.jar;.; |
Linux | export CLASSPATH = $ CLASSPATH: $ JUNIT_HOME / junit4.11.jar: $ JUNIT_HOME / hamcrest-core-1.2.1.jar :. |
макинтош | export CLASSPATH = $ CLASSPATH: $ JUNIT_HOME / junit4.11.jar: $ JUNIT_HOME / hamcrest-core-1.2.1.jar :. |
Мокито — первое применение
Прежде чем углубляться в детали Mockito Framework, давайте посмотрим на приложение в действии. В этом примере мы создали макет Stock Service, чтобы получить фиктивную цену некоторых акций, а также протестировали модуль java под названием Portfolio.
Процесс обсуждается ниже в пошаговом порядке.
Шаг 1 — Создайте класс JAVA для представления акции
Файл: Stock.java
public class Stock { private String stockId; private String name; private int quantity; public Stock(String stockId, String name, int quantity){ this.stockId = stockId; this.name = name; this.quantity = quantity; } public String getStockId() { return stockId; } public void setStockId(String stockId) { this.stockId = stockId; } public int getQuantity() { return quantity; } public String getTicker() { return name; } }
Шаг 2 — Создание интерфейса StockService для получения цены акции
Файл: StockService.java
public interface StockService { public double getPrice(Stock stock); }
Шаг 3 — Создание портфолио класса для представления портфолио любого клиента
Файл: Portfolio.java
import java.util.List; public class Portfolio { private StockService stockService; private List<Stock> stocks; public StockService getStockService() { return stockService; } public void setStockService(StockService stockService) { this.stockService = stockService; } public List<Stock> getStocks() { return stocks; } public void setStocks(List<Stock> stocks) { this.stocks = stocks; } public double getMarketValue(){ double marketValue = 0.0; for(Stock stock:stocks){ marketValue += stockService.getPrice(stock) * stock.getQuantity(); } return marketValue; } }
Шаг 4 — Проверьте класс портфолио
Давайте проверим класс Portfolio, введя в него макет StockService. Mock будет создан Mockito.
Файл: PortfolioTester.java
package com.tutorialspoint.mock; import java.util.ArrayList; import java.util.List; import static org.mockito.Mockito.*; public class PortfolioTester { Portfolio portfolio; StockService stockService; public static void main(String[] args){ PortfolioTester tester = new PortfolioTester(); tester.setUp(); System.out.println(tester.testMarketValue()?"pass":"fail"); } public void setUp(){ //Create a portfolio object which is to be tested portfolio = new Portfolio(); //Create the mock object of stock service stockService = mock(StockService.class); //set the stockService to the portfolio portfolio.setStockService(stockService); } public boolean testMarketValue(){ //Creates a list of stocks to be added to the portfolio List<Stock> stocks = new ArrayList<Stock>(); Stock googleStock = new Stock("1","Google", 10); Stock microsoftStock = new Stock("2","Microsoft",100); stocks.add(googleStock); stocks.add(microsoftStock); //add stocks to the portfolio portfolio.setStocks(stocks); //mock the behavior of stock service to return the value of various stocks when(stockService.getPrice(googleStock)).thenReturn(50.00); when(stockService.getPrice(microsoftStock)).thenReturn(1000.00); double marketValue = portfolio.getMarketValue(); return marketValue == 100500.0; } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac Stock.java StockService.java Portfolio.java PortfolioTester.java
Теперь запустите PortfolioTester, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java PortfolioTester
Проверьте вывод
pass
Mockito — Интеграция JUnit
В этой главе мы узнаем, как интегрировать JUnit и Mockito вместе. Здесь мы создадим математическое приложение, которое использует CalculatorService для выполнения основных математических операций, таких как сложение, вычитание, умножение и деление.
Мы будем использовать Mockito для насмешки над фиктивной реализацией CalculatorService. Кроме того, мы широко использовали аннотации, чтобы продемонстрировать их совместимость с JUnit и Mockito.
Процесс обсуждается ниже в пошаговом порядке.
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { //@InjectMocks annotation is used to create and inject the mock object @InjectMocks MathApplication mathApplication = new MathApplication(); //@Mock annotation is used to create the mock object to be injected @Mock CalculatorService calcService; @Test public void testAdd(){ //add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00); //test the add functionality Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); } }
Шаг 4 — Создайте класс для выполнения в тестовых примерах
Создайте файл Java-класса с именем TestRunner в C> Mockito_WORKSPACE для выполнения тестовых примеров.
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Чтобы узнать больше о JUnit, пожалуйста, обратитесь к Учебному пособию по JUnit в Tutorials Point.
Мокито — добавление поведения
Mockito добавляет функциональность к фиктивному объекту, используя методы when () . Взгляните на следующий фрагмент кода.
//add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00);
Здесь мы проинструктировали Mockito дать поведение добавления 10 и 20 к методу add calcService и в результате вернуть значение 30,00.
На данный момент Mock записал поведение и является рабочим макетом объекта.
//add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00);
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { //@InjectMocks annotation is used to create and inject the mock object @InjectMocks MathApplication mathApplication = new MathApplication(); //@Mock annotation is used to create the mock object to be injected @Mock CalculatorService calcService; @Test public void testAdd(){ //add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00); //test the add functionality Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Мокито — проверка поведения
Mockito может гарантировать, вызывается ли фиктивный метод с необходимыми аргументами или нет. Это делается с помощью метода verify () . Взгляните на следующий фрагмент кода.
//test the add functionality Assert.assertEquals(calcService.add(10.0, 20.0),30.0,0); //verify call to calcService is made or not with same arguments. verify(calcService).add(10.0, 20.0);
Пример — verify () с теми же аргументами
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ //return calcService.add(input1, input2); return input1 + input2; } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { //@InjectMocks annotation is used to create and inject the mock object @InjectMocks MathApplication mathApplication = new MathApplication(); //@Mock annotation is used to create the mock object to be injected @Mock CalculatorService calcService; @Test public void testAdd(){ //add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00); //test the add functionality Assert.assertEquals(calcService.add(10.0, 20.0),30.0,0); //verify the behavior verify(calcService).add(10.0, 20.0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Пример — verify () с разными аргументами
Шаг 1 — Создание интерфейса CalculatorService для предоставления математических функций
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ //return calcService.add(input1, input2); return input1 + input2; } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { //@InjectMocks annotation is used to create and inject the mock object @InjectMocks MathApplication mathApplication = new MathApplication(); //@Mock annotation is used to create the mock object to be injected @Mock CalculatorService calcService; @Test public void testAdd(){ //add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00); //test the add functionality Assert.assertEquals(calcService.add(10.0, 20.0),30.0,0); //verify the behavior verify(calcService).add(20.0, 30.0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
testAdd(MathApplicationTester): Argument(s) are different! Wanted: calcService.add(20.0, 30.0); -> at MathApplicationTester.testAdd(MathApplicationTester.java:32) Actual invocation has different arguments: calcService.add(10.0, 20.0); -> at MathApplication.add(MathApplication.java:10) false
Мокито — ожидание звонков
Mockito предоставляет специальную проверку количества вызовов, которые могут быть сделаны определенным методом. Предположим, что MathApplication должен вызывать метод CalculatorService.serviceUsed () только один раз, тогда он не сможет вызывать CalculatorService.serviceUsed () более одного раза.
//add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00); //limit the method call to 1, no less and no more calls are allowed verify(calcService, times(1)).add(10.0, 20.0);
Создайте интерфейс CalculatorService следующим образом.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.times; import static org.mockito.Mockito.never; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { //@InjectMocks annotation is used to create and inject the mock object @InjectMocks MathApplication mathApplication = new MathApplication(); //@Mock annotation is used to create the mock object to be injected @Mock CalculatorService calcService; @Test public void testAdd(){ //add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00); //add the behavior of calc service to subtract two numbers when(calcService.subtract(20.0,10.0)).thenReturn(10.00); //test the add functionality Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); //test the subtract functionality Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0.0); //default call count is 1 verify(calcService).subtract(20.0, 10.0); //check if add function is called three times verify(calcService, times(3)).add(10.0, 20.0); //verify that method was never called on a mock verify(calcService, never()).multiply(10.0,20.0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Мокито — различные звонки
Mockito предоставляет следующие дополнительные методы для изменения ожидаемого количества вызовов.
-
atLeast (int min) — ожидает минимальных вызовов.
-
atLeastOnce () — ожидает как минимум один вызов.
-
atMost (int max) — ожидает максимум вызовов.
atLeast (int min) — ожидает минимальных вызовов.
atLeastOnce () — ожидает как минимум один вызов.
atMost (int max) — ожидает максимум вызовов.
пример
Шаг 1 — Создание интерфейса CalculatorService для предоставления математических функций
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atMost; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { //@InjectMocks annotation is used to create and inject the mock object @InjectMocks MathApplication mathApplication = new MathApplication(); //@Mock annotation is used to create the mock object to be injected @Mock CalculatorService calcService; @Test public void testAdd(){ //add the behavior of calc service to add two numbers when(calcService.add(10.0,20.0)).thenReturn(30.00); //add the behavior of calc service to subtract two numbers when(calcService.subtract(20.0,10.0)).thenReturn(10.00); //test the add functionality Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); //test the subtract functionality Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0.0); //check a minimum 1 call count verify(calcService, atLeastOnce()).subtract(20.0, 10.0); //check if add function is called minimum 2 times verify(calcService, atLeast(2)).add(10.0, 20.0); //check if add function is called maximum 3 times verify(calcService, atMost(3)).add(10.0,20.0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов.
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Mockito — обработка исключений
Mockito предоставляет возможность макету генерировать исключения, так что обработка исключений может быть протестирована. Взгляните на следующий фрагмент кода.
//add the behavior to throw exception doThrow(new Runtime Exception("divide operation not implemented")) .when(calcService).add(10.0,20.0);
Здесь мы добавили исключение к ложному объекту. MathApplication использует calcService, используя его метод add, и mock генерирует исключение RuntimeException при каждом вызове метода calcService.add ().
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.doThrow; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoRunner.class) public class MathApplicationTester { // @TestSubject annotation is used to identify class which is going to use the mock object @TestSubject MathApplication mathApplication = new MathApplication(); //@Mock annotation is used to create the mock object to be injected @Mock CalculatorService calcService; @Test(expected = RuntimeException.class) public void testAdd(){ //add the behavior to throw exception doThrow(new RuntimeException("Add operation not implemented")) .when(calcService).add(10.0,20.0); //test the add functionality Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
testAdd(MathApplicationTester): Add operation not implemented false
Mockito — Создать Mock
До сих пор мы использовали аннотации для создания макетов. Mockito предоставляет различные методы для создания фиктивных объектов. mock () создает mock, не беспокоясь о порядке вызовов методов, которые mock собирается выполнить в ходе своего действия.
Синтаксис
calcService = mock(CalculatorService.class);
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Здесь мы добавили два вызова фиктивных методов, add () и subtract (), к фиктивному объекту с помощью when (). Однако во время тестирования мы вызывали subtract () перед вызовом add (). Когда мы создаем фиктивный объект с помощью create (), порядок выполнения метода не имеет значения.
Файл: MathApplicationTester.java
package com.tutorialspoint.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { private MathApplication mathApplication; private CalculatorService calcService; @Before public void setUp(){ mathApplication = new MathApplication(); calcService = mock(CalculatorService.class); mathApplication.setCalculatorService(calcService); } @Test public void testAddAndSubtract(){ //add the behavior to add numbers when(calcService.add(20.0,10.0)).thenReturn(30.0); //subtract the behavior to subtract numbers when(calcService.subtract(20.0,10.0)).thenReturn(10.0); //test the subtract functionality Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0); //test the add functionality Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0); //verify call to calcService is made or not verify(calcService).add(20.0,10.0); verify(calcService).subtract(20.0,10.0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Мокито — заказанная проверка
Mockito предоставляет класс Inorder, который заботится о порядке вызовов методов, которые макет собирается выполнить в свое время.
Синтаксис
//create an inOrder verifier for a single mock InOrder inOrder = inOrder(calcService); //following will make sure that add is first called then subtract is called. inOrder.verify(calcService).add(20.0,10.0); inOrder.verify(calcService).subtract(20.0,10.0);
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Здесь мы добавили два вызова фиктивных методов, add () и subtract (), к фиктивному объекту с помощью when (). Однако во время тестирования мы вызывали subtract () перед вызовом add (). Когда мы создаем фиктивный объект с использованием Mockito, порядок выполнения метода не имеет значения. Используя класс InOrder, мы можем обеспечить порядок вызовов.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.inOrder; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { private MathApplication mathApplication; private CalculatorService calcService; @Before public void setUp(){ mathApplication = new MathApplication(); calcService = mock(CalculatorService.class); mathApplication.setCalculatorService(calcService); } @Test public void testAddAndSubtract(){ //add the behavior to add numbers when(calcService.add(20.0,10.0)).thenReturn(30.0); //subtract the behavior to subtract numbers when(calcService.subtract(20.0,10.0)).thenReturn(10.0); //test the add functionality Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0); //test the subtract functionality Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0); //create an inOrder verifier for a single mock InOrder inOrder = inOrder(calcService); //following will make sure that add is first called then subtract is called. inOrder.verify(calcService).subtract(20.0,10.0); inOrder.verify(calcService).add(20.0,10.0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
testAddAndSubtract(MathApplicationTester): Verification in order failure Wanted but not invoked: calculatorService.add(20.0, 10.0); -> at MathApplicationTester.testAddAndSubtract(MathApplicationTester.java:48) Wanted anywhere AFTER following interaction: calculatorService.subtract(20.0, 10.0); -> at MathApplication.subtract(MathApplication.java:13) false
Мокито — обратные вызовы
Mockito предоставляет интерфейс ответа, который позволяет использовать стандартный интерфейс.
Синтаксис
//add the behavior to add numbers when(calcService.add(20.0,10.0)).thenAnswer(new Answer<Double>() { @Override public Double answer(InvocationOnMock invocation) throws Throwable { //get the arguments passed to mock Object[] args = invocation.getArguments(); //get the mock Object mock = invocation.getMock(); //return the result return 30.0; } });
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Здесь мы добавили один вызов метода-метода add () к объекту-объекту via when (). Однако во время тестирования мы вызывали subtract () перед вызовом add (). Когда мы создаем фиктивный объект с помощью Mockito.createStrictMock (), порядок выполнения метода имеет значение.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.inOrder; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { private MathApplication mathApplication; private CalculatorService calcService; @Before public void setUp(){ mathApplication = new MathApplication(); calcService = mock(CalculatorService.class); mathApplication.setCalculatorService(calcService); } @Test public void testAdd(){ //add the behavior to add numbers when(calcService.add(20.0,10.0)).thenAnswer(new Answer<Double>() { @Override public Double answer(InvocationOnMock invocation) throws Throwable { //get the arguments passed to mock Object[] args = invocation.getArguments(); //get the mock Object mock = invocation.getMock(); //return the result return 30.0; } }); //test the add functionality Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Мокито — шпионаж
Mockito предоставляет возможность создавать шпионов на реальных объектах. Когда вызывается шпион, то вызывается реальный метод реального объекта.
Синтаксис
//create a spy on actual object calcService = spy(calculator); //perform operation on real object //test the add functionality Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Здесь мы добавили один вызов метода-метода add () к объекту-объекту via when (). Однако во время тестирования мы вызывали subtract () перед вызовом add (). Когда мы создаем фиктивный объект с помощью Mockito.createStrictMock (), порядок выполнения метода имеет значение.
Файл: MathApplicationTester.java
import static org.mockito.Mockito.spy; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { private MathApplication mathApplication; private CalculatorService calcService; @Before public void setUp(){ mathApplication = new MathApplication(); Calculator calculator = new Calculator(); calcService = spy(calculator); mathApplication.setCalculatorService(calcService); } @Test public void testAdd(){ //perform operation on real object //test the add functionality Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0); } class Calculator implements CalculatorService { @Override public double add(double input1, double input2) { return input1 + input2; } @Override public double subtract(double input1, double input2) { throw new UnsupportedOperationException("Method not implemented yet!"); } @Override public double multiply(double input1, double input2) { throw new UnsupportedOperationException("Method not implemented yet!"); } @Override public double divide(double input1, double input2) { throw new UnsupportedOperationException("Method not implemented yet!"); } } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Mockito — Сброс Mock
Mockito предоставляет возможность сброса макета, чтобы его можно было использовать позже. Взгляните на следующий фрагмент кода.
//reset mock reset(calcService);
Здесь мы сбросили макет объекта. MathApplication использует calcService и после сброса mock, использование mocked-метода провалит тест.
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
package com.tutorialspoint.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.Mockito.reset; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { private MathApplication mathApplication; private CalculatorService calcService; @Before public void setUp(){ mathApplication = new MathApplication(); calcService = mock(CalculatorService.class); mathApplication.setCalculatorService(calcService); } @Test public void testAddAndSubtract(){ //add the behavior to add numbers when(calcService.add(20.0,10.0)).thenReturn(30.0); //test the add functionality Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0); //reset the mock reset(calcService); //test the add functionality after resetting the mock Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
testAddAndSubtract(MathApplicationTester): expected:<0.0> but was:<30.0> false
Mockito — развитие, управляемое поведением
Behavior Driven Development — это стиль написания тестов, использующий данные , когда и затем форматирующий как методы тестирования. Mockito предоставляет специальные методы для этого. Взгляните на следующий фрагмент кода.
//Given given(calcService.add(20.0,10.0)).willReturn(30.0); //when double result = calcService.add(20.0,10.0); //then Assert.assertEquals(result,30.0,0);
Здесь мы используем данный метод класса BDDMockito вместо метода when .
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
package com.tutorialspoint.mock; import static org.mockito.BDDMockito.*; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { private MathApplication mathApplication; private CalculatorService calcService; @Before public void setUp(){ mathApplication = new MathApplication(); calcService = mock(CalculatorService.class); mathApplication.setCalculatorService(calcService); } @Test public void testAdd(){ //Given given(calcService.add(20.0,10.0)).willReturn(30.0); //when double result = calcService.add(20.0,10.0); //then Assert.assertEquals(result,30.0,0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.
true
Мокито — Таймауты
Mockito предоставляет специальную опцию Timeout, чтобы проверить, вызывается ли метод в течение оговоренного периода времени.
Синтаксис
//passes when add() is called within 100 ms. verify(calcService,timeout(100)).add(20.0,10.0);
пример
Шаг 1 — Создайте интерфейс CalculatorService для предоставления математических функций.
Файл: CalculatorService.java
public interface CalculatorService { public double add(double input1, double input2); public double subtract(double input1, double input2); public double multiply(double input1, double input2); public double divide(double input1, double input2); }
Шаг 2 — Создайте класс JAVA для представления MathApplication
Файл: MathApplication.java
public class MathApplication { private CalculatorService calcService; public void setCalculatorService(CalculatorService calcService){ this.calcService = calcService; } public double add(double input1, double input2){ return calcService.add(input1, input2); } public double subtract(double input1, double input2){ return calcService.subtract(input1, input2); } public double multiply(double input1, double input2){ return calcService.multiply(input1, input2); } public double divide(double input1, double input2){ return calcService.divide(input1, input2); } }
Шаг 3 — Проверьте класс MathApplication
Давайте проверим класс MathApplication, введя в него макет calculatorService. Mock будет создан Mockito.
Файл: MathApplicationTester.java
package com.tutorialspoint.mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.runners.MockitoJUnitRunner; // @RunWith attaches a runner with the test class to initialize the test data @RunWith(MockitoJUnitRunner.class) public class MathApplicationTester { private MathApplication mathApplication; private CalculatorService calcService; @Before public void setUp(){ mathApplication = new MathApplication(); calcService = mock(CalculatorService.class); mathApplication.setCalculatorService(calcService); } @Test public void testAddAndSubtract(){ //add the behavior to add numbers when(calcService.add(20.0,10.0)).thenReturn(30.0); //subtract the behavior to subtract numbers when(calcService.subtract(20.0,10.0)).thenReturn(10.0); //test the subtract functionality Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0); //test the add functionality Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0); //verify call to add method to be completed within 100 ms verify(calcService, timeout(100)).add(20.0,10.0); //invocation count can be added to ensure multiplication invocations //can be checked within given timeframe verify(calcService, timeout(100).times(1)).subtract(20.0,10.0); } }
Шаг 4 — Выполнить контрольные примеры
Создайте файл Java-класса с именем TestRunner в C: \> Mockito_WORKSPACE для выполнения тестовых наборов .
Файл: TestRunner.java
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(MathApplicationTester.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
Шаг 5 — Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication. java MathApplicationTester.java TestRunner.java
Теперь запустите Test Runner, чтобы увидеть результат —
C:\Mockito_WORKSPACE>java TestRunner
Проверьте вывод.