Mockito - Szybki przewodnik
Co to jest kpina?
Mockowanie to sposób na przetestowanie funkcjonalności klasy w izolacji. Mockowanie nie wymaga połączenia z bazą danych ani odczytu pliku właściwości ani odczytu serwera plików w celu przetestowania funkcjonalności. Pozorowane obiekty kpią z prawdziwej usługi. Obiekt pozorowany zwraca fikcyjne dane odpowiadające jakimś fałszywym danym wejściowym przekazanym do niego.
Mockito
Mockito ułatwia płynne tworzenie pozorowanych obiektów. Używa Java Reflection do tworzenia pozorowanych obiektów dla danego interfejsu. Obiekty pozorowane to nic innego jak proxy dla rzeczywistych implementacji.
Rozważmy przypadek usługi magazynowej, która zwraca szczegóły ceny akcji. Podczas opracowywania rzeczywistej usługi magazynowej nie można używać do uzyskiwania danych w czasie rzeczywistym. Potrzebujemy więc fikcyjnej implementacji usługi magazynowej. Mockito może zrobić to samo bardzo łatwo, jak sugeruje jego nazwa.
Korzyści z Mockito
No Handwriting - Nie ma potrzeby samodzielnego pisania pozorowanych obiektów.
Refactoring Safe - Zmiana nazw metod interfejsu lub zmiana kolejności parametrów nie zepsuje kodu testu, ponieważ makiety są tworzone w czasie wykonywania.
Return value support - Obsługuje zwracane wartości.
Exception support - Obsługuje wyjątki.
Order check support - Obsługuje sprawdzanie kolejności wywołań metod.
Annotation support - Obsługuje tworzenie mocków za pomocą adnotacji.
Rozważ następujący fragment kodu.
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);
}
}
Rozumiemy ważne koncepcje powyższego programu. Pełny kod jest dostępny w rozdzialeFirst Application.
Portfolio - Obiekt do prowadzenia listy zapasów i uzyskiwania wartości rynkowej obliczonej na podstawie cen akcji i ilości zapasów.
Stock - Przedmiot zawierający szczegółowe informacje o magazynie, takie jak identyfikator, nazwa, ilość itp.
StockService - Usługa magazynowa zwraca bieżącą cenę akcji.
mock(...) - Mockito stworzył makietę usługi magazynowej.
when(...).thenReturn(...)- Mock implementacja metody getPrice interfejsu stockService. W przypadku GoogleStock zwróć 50,00 jako cenę.
portfolio.setStocks(...) - Portfel zawiera teraz listę dwóch akcji.
portfolio.setStockService(...) - przypisuje obiekt stockService Mock do portfela.
portfolio.getMarketValue() - Portfel zwraca wartość rynkową na podstawie swoich zapasów, korzystając z usługi makiety zapasów.
Mockito to framework dla Javy, więc pierwszym wymaganiem jest zainstalowanie JDK na twoim komputerze.
Wymagania systemowe
JDK | 1.5 lub nowszy. |
---|---|
Pamięć | brak wymagań minimalnych. |
Miejsca na dysku | brak wymagań minimalnych. |
System operacyjny | brak wymagań minimalnych. |
Step 1 − Verify Java Installation on Your Machine
Otwórz konsolę i wykonaj następujące czynności java Komenda.
OS | Zadanie | Komenda |
---|---|---|
Windows | Otwórz konsolę poleceń | c: \> java -version |
Linux | Otwórz terminal poleceń | $ java -version |
Prochowiec | Otwórz Terminal | maszyna:> joseph $ java -version |
Sprawdźmy dane wyjściowe dla wszystkich systemów operacyjnych -
OS | Wynik |
---|---|
Windows | wersja java „1.6.0_21” Java (TM) SE Runtime Environment (kompilacja 1.6.0_21-b07) Maszyna wirtualna klienta Java HotSpot (TM) (kompilacja 17.0-b17, tryb mieszany, udostępnianie) |
Linux | wersja java „1.6.0_21” Java (TM) SE Runtime Environment (kompilacja 1.6.0_21-b07) Maszyna wirtualna klienta Java HotSpot (TM) (kompilacja 17.0-b17, tryb mieszany, udostępnianie) |
Prochowiec | wersja java „1.6.0_21” Java (TM) SE Runtime Environment (kompilacja 1.6.0_21-b07) Java HotSpot (TM) 64-bitowa maszyna wirtualna serwera (kompilacja 17.0-b17, tryb mieszany, udostępnianie) |
Jeśli nie masz zainstalowanego oprogramowania Java, kliknij tutaj , aby zainstalować pakiet Java Software Development Kit (SDK) .
Zakładamy, że na potrzeby tego samouczka w systemie jest zainstalowana Java 1.6.0_21.
Step 2 − Set JAVA Environment
Ustaw JAVA_HOMEzmienna środowiskowa wskazująca lokalizację katalogu podstawowego, w którym na komputerze jest zainstalowana Java. Na przykład,
OS | Wynik |
---|---|
Windows | Ustaw zmienną środowiskową JAVA_HOME na C: \ Program Files \ Java \ jdk1.6.0_21 |
Linux | eksportuj JAVA_HOME = / usr / local / java-current |
Prochowiec | eksportuj JAVA_HOME = / Library / Java / Home |
Dołącz lokalizację kompilatora Java do ścieżki systemowej.
OS | Wynik |
---|---|
Windows | Dołącz ciąg; C: \ Program Files \ Java \ jdk1.6.0_21 \ bin na końcu zmiennej systemowej Path. |
Linux | export PATH = $ PATH: $ JAVA_HOME / bin / |
Prochowiec | nie wymagane |
Sprawdź instalację oprogramowania Java za pomocą polecenia java -version jak wyjaśniono powyżej.
Step 3 − Download Mockito-All Archive
Aby pobrać najnowszą wersję Mockito z repozytorium Maven, kliknij tutaj.
Zapisz plik jar na dysku C, powiedzmy C: \> Mockito.
OS | Nazwa archiwum |
---|---|
Windows | mockito-all-2.0.2-beta.jar |
Linux | mockito-all-2.0.2-beta.jar |
Prochowiec | mockito-all-2.0.2-beta.jar |
Step 4 − Set Mockito Environment
Ustaw Mockito_HOMEzmienną środowiskową, aby wskazywała na lokalizację katalogu podstawowego, w którym na komputerze są przechowywane Mockito i pliki słoików zależności. Poniższa tabela pokazuje, jak ustawić zmienną środowiskową w różnych systemach operacyjnych, zakładając, że wyodrębniliśmy mockito-all-2.0.2-beta.jar do folderu C: \> Mockito.
OS | Wynik |
---|---|
Windows | Ustaw zmienną środowiskową Mockito_HOME na C: \ Mockito |
Linux | export Mockito_HOME = / usr / local / Mockito |
Prochowiec | eksportuj Mockito_HOME = / Library / Mockito |
Step 5 − Set CLASSPATH Variable
Ustaw CLASSPATHzmienna środowiskowa wskazująca lokalizację, w której przechowywany jest słoik Mockito. W poniższej tabeli pokazano, jak ustawić zmienną CLASSPATH w różnych systemach operacyjnych.
OS | Wynik |
---|---|
Windows | Ustaw zmienną środowiskową CLASSPATH na% CLASSPATH%;% Mockito_HOME% \ mockito-all-2.0.2-beta.jar;.; |
Linux | export CLASSPATH = $ CLASSPATH: $ Mockito_HOME / mockito-all-2.0.2-beta.jar :. |
Prochowiec | export CLASSPATH = $ CLASSPATH: $ Mockito_HOME / mockito-all-2.0.2-beta.jar :. |
Step 6 − Download JUnit Archive
Pobierz najnowszą wersję pliku jar JUnit z Github . Zapisz folder w lokalizacji C: \> Junit.
OS | Nazwa archiwum |
---|---|
Windows | junit4.11.jar, hamcrest-core-1.2.1.jar |
Linux | junit4.11.jar, hamcrest-core-1.2.1.jar |
Prochowiec | junit4.11.jar, hamcrest-core-1.2.1.jar |
Step 7 − Set JUnit Environment
Ustaw JUNIT_HOMEzmienna środowiskowa wskazująca lokalizację katalogu podstawowego, w którym na komputerze są przechowywane pliki JUnit JAR. Poniższa tabela pokazuje, jak ustawić tę zmienną środowiskową w różnych systemach operacyjnych, zakładając, że przechowujemy junit4.11.jar i hamcrest-core-1.2.1.jar w C: \> Junit.
OS | Wynik |
---|---|
Windows | Ustaw zmienną środowiskową JUNIT_HOME na C: \ JUNIT |
Linux | export JUNIT_HOME = / usr / local / JUNIT |
Prochowiec | eksportuj JUNIT_HOME = / Library / JUNIT |
Step 8 − Set CLASSPATH Variable
Ustaw zmienną środowiskową CLASSPATH, aby wskazywała lokalizację jar JUNIT. Poniższa tabela pokazuje, jak to się robi w różnych systemach operacyjnych.
OS | Wynik |
---|---|
Windows | Ustaw zmienną środowiskową CLASSPATH na% 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 :. |
Prochowiec | export CLASSPATH = $ CLASSPATH: $ JUNIT_HOME / junit4.11.jar: $ JUNIT_HOME / hamcrest-core-1.2.1.jar :. |
Zanim przejdziemy do szczegółów Mockito Framework, zobaczmy, jak działa aplikacja. W tym przykładzie utworzyliśmy makietę usługi Stock Service, aby uzyskać fałszywą cenę niektórych akcji i przetestowaliśmy jednostkę klasy Java o nazwie Portfolio.
Proces jest omówiony poniżej krok po kroku.
Step 1 − Create a JAVA class to represent the Stock
File: 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;
}
}
Step 2 − Create an interface StockService to get the price of a stock
File: StockService.java
public interface StockService {
public double getPrice(Stock stock);
}
Step 3 − Create a class Portfolio to represent the portfolio of any client
File: 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;
}
}
Step 4 − Test the Portfolio class
Przetestujmy klasę Portfolio, wstrzykując do niej makietę usługi stock. Mock zostanie stworzony przez Mockito.
File: 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;
}
}
Step 5 − Verify the result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac Stock.java StockService.java Portfolio.java PortfolioTester.java
Teraz uruchom PortfolioTester, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java PortfolioTester
Sprawdź dane wyjściowe
pass
W tym rozdziale dowiemy się, jak zintegrować JUnit i Mockito. Tutaj utworzymy aplikację matematyczną, która korzysta z usługi CalculatorService do wykonywania podstawowych operacji matematycznych, takich jak dodawanie, odejmowanie, mnożenie i dzielenie.
Użyjemy Mockito do mockowania fałszywej implementacji CalculatorService. Ponadto szeroko wykorzystaliśmy adnotacje, aby pokazać ich zgodność z JUnit i Mockito.
Proces jest omówiony poniżej krok po kroku.
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Create a class to execute to test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Aby dowiedzieć się więcej o JUnit, zapoznaj się z samouczkiem JUnit w Tutorials Point.
Mockito dodaje funkcjonalność do obiektu makiety przy użyciu metod when(). Spójrz na następujący fragment kodu.
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
Tutaj poinstruowaliśmy Mockito, aby nadał zachowanie polegające na dodaniu 10 i 20 do add metoda calcService iw rezultacie zwraca wartość 30,00.
W tym momencie Mock zarejestrował zachowanie i jest działającym obiektem pozorowanym.
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\>Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Mockito może zapewnić, czy metoda pozorowana jest wywoływana z wymaganymi argumentami, czy nie. Odbywa się to za pomocąverify()metoda. Spójrz na następujący fragment kodu.
//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);
Przykład - weryfikuj () z tymi samymi argumentami
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Przykład - weryfikuj () z różnymi argumentami
Step 1 − Create an interface CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
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 zapewnia specjalne sprawdzenie liczby połączeń, które można wykonać za pomocą określonej metody. Załóżmy, że MathApplication powinien wywołać metodę CalculatorService.serviceUsed () tylko raz, a następnie nie powinien być w stanie wywołać CalculatorService.serviceUsed () więcej niż raz.
//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);
Utwórz interfejs CalculatorService w następujący sposób.
File: 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);
}
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functionsFile: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Mockito zapewnia następujące dodatkowe metody różnicowania oczekiwanej liczby połączeń.
atLeast (int min) - oczekuje min. Połączeń.
atLeastOnce () - oczekuje przynajmniej jednego wezwania.
atMost (int max) - oczekuje max wezwań.
Przykład
Step 1 − Create an interface CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Mockito zapewnia makietowi możliwość zgłaszania wyjątków, więc można przetestować obsługę wyjątków. Spójrz na następujący fragment kodu.
//add the behavior to throw exception
doThrow(new Runtime Exception("divide operation not implemented"))
.when(calcService).add(10.0,20.0);
Tutaj dodaliśmy klauzulę wyjątku do makiety obiektu. MathApplication korzysta z calcService przy użyciu swojej metody add, a makieta generuje wyjątek RuntimeException przy każdym wywołaniu metody calcService.add ().
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
testAdd(MathApplicationTester): Add operation not implemented
false
Do tej pory używaliśmy adnotacji do tworzenia prób. Mockito udostępnia różne metody tworzenia pozorowanych obiektów. mock () tworzy mocky, nie przejmując się kolejnością wywołań metod, które ma wykonać mock w trakcie swojego działania.
Składnia
calcService = mock(CalculatorService.class);
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
Tutaj dodaliśmy dwa pozorowane wywołania metod, add () i subtract (), do obiektu mock poprzez when (). Jednak podczas testowania wywołaliśmy odejmowanie () przed wywołaniem metody add (). Kiedy tworzymy obiekt pozorowany za pomocą funkcji create (), kolejność wykonywania metody nie ma znaczenia.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Mockito udostępnia klasę Inorder, która dba o kolejność wywołań metod, które makieta ma wykonać w trakcie swojego działania.
Składnia
//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);
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
Tutaj dodaliśmy dwa pozorowane wywołania metod, add () i subtract (), do obiektu mock poprzez when (). Jednak podczas testowania wywołaliśmy odejmowanie () przed wywołaniem metody add (). Kiedy tworzymy makietę za pomocą Mockito, kolejność wykonywania metody nie ma znaczenia. Korzystając z klasy InOrder możemy zapewnić kolejność połączeń.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
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 zapewnia interfejs odpowiedzi, który umożliwia zgrywanie z ogólnym interfejsem.
Składnia
//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;
}
});
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
Tutaj dodaliśmy jedno mockowe wywołanie metody, add () do obiektu mock poprzez when (). Jednak podczas testowania wywołaliśmy odejmowanie () przed wywołaniem metody add (). Kiedy tworzymy obiekt pozorowany za pomocą Mockito.createStrictMock (), kolejność wykonywania metody ma znaczenie.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Mockito umożliwia tworzenie szpiegów na rzeczywistych obiektach. Kiedy wywoływany jest spy, wywoływana jest metoda rzeczywistego obiektu.
Składnia
//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);
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
Tutaj dodaliśmy jedno mockowe wywołanie metody, add () do obiektu mock poprzez when (). Jednak podczas testowania wywołaliśmy odejmowanie () przed wywołaniem metody add (). Kiedy tworzymy obiekt pozorowany za pomocą Mockito.createStrictMock (), kolejność wykonywania metody ma znaczenie.
File: 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!");
}
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Mockito zapewnia możliwość zresetowania makiety, aby można ją było później ponownie wykorzystać. Spójrz na następujący fragment kodu.
//reset mock
reset(calcService);
Tutaj zresetowaliśmy obiekt pozorowany. MathApplication korzysta z calcService i po zresetowaniu makiety użycie metody mocked nie powiedzie testu.
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
testAddAndSubtract(MathApplicationTester): expected:<0.0> but was:<30.0>
false
Behavior Driven Development to styl pisania testów given, when i thenformat jako metody testowe. Mockito zapewnia specjalne metody, aby to zrobić. Spójrz na następujący fragment kodu.
//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);
Tutaj używamy given metoda klasy BDDMockito zamiast when metoda .
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true
Mockito zapewnia specjalną opcję limitu czasu, aby sprawdzić, czy metoda jest wywoływana w określonych ramach czasowych.
Składnia
//passes when add() is called within 100 ms.
verify(calcService,timeout(100)).add(20.0,10.0);
Przykład
Step 1 − Create an interface called CalculatorService to provide mathematical functions
File: 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);
}
Step 2 − Create a JAVA class to represent MathApplication
File: 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);
}
}
Step 3 − Test the MathApplication class
Przetestujmy klasę MathApplication, wstrzykując do niej makietę funkcji calculatorService. Mock zostanie stworzony przez Mockito.
File: 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);
}
}
Step 4 − Execute test cases
Utwórz plik klasy Java o nazwie TestRunner w programie C:\> Mockito_WORKSPACE do wykonania przypadków testowych.
File: 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());
}
}
Step 5 − Verify the Result
Skompiluj klasy przy użyciu javac kompilator w następujący sposób -
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
Teraz uruchom Test Runner, aby zobaczyć wynik -
C:\Mockito_WORKSPACE>java TestRunner
Sprawdź dane wyjściowe.
true