Mockito - Hızlı Kılavuz

Alay etmek nedir?

Alay etmek, bir sınıfın işlevselliğini tek başına test etmenin bir yoludur. Alay, bir işlevi test etmek için bir veritabanı bağlantısı veya özellikler dosyası okuması veya dosya sunucusu okuması gerektirmez. Sahte nesneler gerçek hizmetle alay eder. Sahte bir nesne, kendisine geçirilen bazı sahte girdilere karşılık gelen sahte bir veri döndürür.

Mockito

Mockito, sahte nesnelerin sorunsuz bir şekilde oluşturulmasını kolaylaştırır. Belirli bir arayüz için sahte nesneler oluşturmak için Java Reflection kullanır. Sahte nesneler, gerçek uygulamalar için vekildir.

Bir hisse senedinin fiyat ayrıntılarını döndüren bir Stok Hizmeti durumu düşünün. Geliştirme sırasında, gerçek stok hizmeti gerçek zamanlı veri almak için kullanılamaz. Bu nedenle stok hizmetinin sahte bir şekilde uygulanmasına ihtiyacımız var. Mockito, adından da anlaşılacağı gibi aynı şeyi çok kolay bir şekilde yapabilir.

Mockito'nun Faydaları

  • No Handwriting - Kendi başınıza sahte nesneler yazmanıza gerek yok.

  • Refactoring Safe - Arayüz yöntemi adlarını yeniden adlandırmak veya parametreleri yeniden sıralamak, Mock'lar çalışma zamanında oluşturulduğundan test kodunu bozmaz.

  • Return value support - Dönüş değerlerini destekler.

  • Exception support - İstisnaları destekler.

  • Order check support - Yöntem çağrılarının sırasını kontrol etmeyi destekler.

  • Annotation support - Ek açıklama kullanarak örnek oluşturmayı destekler.

Aşağıdaki kod parçacığını düşünün.

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);
   }
}

Yukarıdaki programın önemli kavramlarını anlayalım. Kodun tamamı bu bölümde mevcutturFirst Application.

  • Portfolio - Bir hisse senedi listesi taşımak ve hisse senedi fiyatları ve stok miktarı kullanılarak hesaplanan piyasa değerini elde etmek için bir nesne.

  • Stock - Bir hisse senedinin kimliği, adı, miktarı vb. Gibi ayrıntılarını taşıyan bir nesne.

  • StockService - Bir hisse senedi hizmeti, bir hisse senedinin geçerli fiyatını döndürür.

  • mock(...) - Mockito bir hisse senedi servisi yarattı.

  • when(...).thenReturn(...)- stockService arabiriminin getPrice yönteminin sahte uygulaması. GoogleStock için 50,00 fiyatını döndür.

  • portfolio.setStocks(...) - Portföy artık iki hisse senedinin listesini içerir.

  • portfolio.setStockService(...) - StockService Mock nesnesini portföye atar.

  • portfolio.getMarketValue() - Portföy, sahte hisse senedi hizmetini kullanarak hisse senetlerine göre piyasa değerini döndürür.

Mockito, Java için bir çerçevedir, bu nedenle ilk gereksinim, makinenize JDK'nın yüklenmiş olmasıdır.

Sistem gereksinimleri

JDK 1.5 veya üstü.
Hafıza minimum gereklilik yok.
Disk alanı minimum gereklilik yok.
İşletim sistemi minimum gereklilik yok.

Step 1 − Verify Java Installation on Your Machine

Konsolu açın ve aşağıdakileri yürütün java komut.

işletim sistemi Görev Komut
pencereler Komut Konsolunu Aç c: \> java sürümü
Linux Komut Terminalini Aç $ java sürümü
Mac Açık Terminal makine:> joseph $ java-sürümü

Tüm işletim sistemleri için çıktıyı doğrulayalım -

işletim sistemi Çıktı
pencereler

java sürümü "1.6.0_21"

Java (TM) SE Çalışma Zamanı Ortamı (derleme 1.6.0_21-b07)

Java HotSpot (TM) Client VM (derleme 17.0-b17, karma mod, paylaşım)

Linux

java sürümü "1.6.0_21"

Java (TM) SE Çalışma Zamanı Ortamı (derleme 1.6.0_21-b07)

Java HotSpot (TM) Client VM (derleme 17.0-b17, karma mod, paylaşım)

Mac

java sürümü "1.6.0_21"

Java (TM) SE Çalışma Zamanı Ortamı (derleme 1.6.0_21-b07)

Java HotSpot (TM) 64-Bit Sunucu VM (derleme 17.0-b17, karma mod, paylaşım)

Java kurulu değilse, Java Yazılım Geliştirme Kiti'ni (SDK) yüklemek için burayı tıklayın.

Bu eğitim için sisteminizde Java 1.6.0_21 kurulu olduğunu varsayıyoruz.

Step 2 − Set JAVA Environment

Yı kur JAVA_HOMEJava'nın makinenizde kurulu olduğu temel dizin konumunu gösteren ortam değişkeni. Örneğin,

işletim sistemi Çıktı
pencereler JAVA_HOME ortam değişkenini C: \ Program Files \ Java \ jdk1.6.0_21 olarak ayarlayın
Linux dışa aktar JAVA_HOME = / usr / local / java-current
Mac dışa aktar JAVA_HOME = / Kitaplık / Java / Ana Sayfa

Java derleyicisinin konumunu Sistem Yolunuza ekleyin.

işletim sistemi Çıktı
pencereler C: \ Program Files \ Java \ jdk1.6.0_21 \ bin dizesini sistem değişkeninin, Yol'un sonuna ekleyin.
Linux dışa aktar PATH = $ PATH: $ JAVA_HOME / bin /
Mac gerekli değil

Komutu kullanarak Java Kurulumunu doğrulayın java -version yukarıda açıklandığı gibi.

Step 3 − Download Mockito-All Archive

Mockito'nun en son sürümünü Maven Deposundan indirmek için buraya tıklayın.

Jar dosyasını C sürücünüze kaydedin, diyelim ki C: \> Mockito.

işletim sistemi Arşiv adı
pencereler mockito-all-2.0.2-beta.jar
Linux mockito-all-2.0.2-beta.jar
Mac mockito-all-2.0.2-beta.jar

Step 4 − Set Mockito Environment

Yı kur Mockito_HOMEMockito ve bağımlılık kavanozlarının makinenizde depolandığı temel dizin konumuna işaret etmek için ortam değişkeni. Aşağıdaki tablo, mockito-all-2.0.2-beta.jar dosyasını C: \> Mockito klasörüne çıkardığımızı varsayarak, farklı işletim sistemlerinde ortam değişkeninin nasıl ayarlanacağını gösterir.

işletim sistemi Çıktı
pencereler Mockito_HOME ortam değişkenini C: \ Mockito olarak ayarlayın
Linux Mockito_HOME = / usr / local / Mockito'yu dışa aktar
Mac Mockito_HOME = / Library / Mockito'yu dışa aktar

Step 5 − Set CLASSPATH Variable

Yı kur CLASSPATHMockito jar'inin depolandığı konumu gösteren ortam değişkeni. Aşağıdaki tablo, CLASSPATH değişkeninin farklı işletim sistemlerinde nasıl ayarlanacağını gösterir.

işletim sistemi Çıktı
pencereler CLASSPATH ortam değişkenini% CLASSPATH%;% Mockito_HOME% \ mockito-all-2.0.2-beta.jar;;
Linux dışa aktar CLASSPATH = $ CLASSPATH: $ Mockito_HOME / mockito-all-2.0.2-beta.jar :.
Mac dışa aktar CLASSPATH = $ CLASSPATH: $ Mockito_HOME / mockito-all-2.0.2-beta.jar :.

Step 6 − Download JUnit Archive

JUnit jar dosyasının en son sürümünü Github'dan indirin . Klasörü C: \> Junit konumuna kaydedin.

işletim sistemi Arşiv adı
pencereler junit4.11.jar, hamcrest-core-1.2.1.jar
Linux junit4.11.jar, hamcrest-core-1.2.1.jar
Mac junit4.11.jar, hamcrest-core-1.2.1.jar

Step 7 − Set JUnit Environment

Yı kur JUNIT_HOMEJUnit kavanozlarının makinenizde depolandığı temel dizin konumuna işaret etmek için ortam değişkeni. Aşağıdaki tablo, junit4.11.jar ve hamcrest-core-1.2.1.jar'ı C: \> Junit'te depoladığımızı varsayarak, bu ortam değişkeninin farklı işletim sistemlerinde nasıl ayarlanacağını gösterir.

işletim sistemi Çıktı
pencereler JUNIT_HOME ortam değişkenini C: \ JUNIT olarak ayarlayın
Linux JUNIT_HOME = / usr / local / JUNIT dışa aktar
Mac dışa aktar JUNIT_HOME = / Kitaplık / JUNIT

Step 8 − Set CLASSPATH Variable

CLASSPATH ortam değişkenini JUNIT akü konumunu işaret edecek şekilde ayarlayın. Aşağıdaki tablo, farklı işletim sistemlerinde nasıl yapıldığını göstermektedir.

işletim sistemi Çıktı
pencereler CLASSPATH ortam değişkenini% CLASSPATH%;% JUNIT_HOME% \ junit4.11.jar;% JUNIT_HOME% \ hamcrest-core-1.2.1.jar;.;
Linux dışa aktar CLASSPATH = $ CLASSPATH: $ JUNIT_HOME / junit4.11.jar: $ JUNIT_HOME / hamcrest-core-1.2.1.jar :.
Mac dışa aktar CLASSPATH = $ CLASSPATH: $ JUNIT_HOME / junit4.11.jar: $ JUNIT_HOME / hamcrest-core-1.2.1.jar :.

Mockito Framework'ün detaylarına geçmeden önce, bir uygulamanın işleyişini görelim. Bu örnekte, bazı hisse senetlerinin sahte fiyatını almak için bir Stok Hizmeti taklidi oluşturduk ve Portföy adlı bir java sınıfını test ettik.

Süreç aşağıda adım adım tartışılmaktadır.

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

Portföy sınıfını, içine bir hisse senedi hizmeti taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac Stock.java StockService.java Portfolio.java PortfolioTester.java

Şimdi sonucu görmek için PortfolioTester'ı çalıştırın -

C:\Mockito_WORKSPACE>java PortfolioTester

Çıkışı Doğrulayın

pass

Bu bölümde, JUnit ve Mockito'nun nasıl entegre edileceğini öğreneceğiz. Burada, toplama, çıkarma, çarpma ve bölme gibi temel matematiksel işlemleri gerçekleştirmek için CalculatorService kullanan bir Matematik Uygulaması oluşturacağız.

Mockito'yu CalculatorService'in sahte uygulamasıyla alay etmek için kullanacağız. Ek olarak, hem JUnit hem de Mockito ile uyumluluğunu sergilemek için ek açıklamaları kapsamlı şekilde kullandık.

Süreç aşağıda adım adım tartışılmaktadır.

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

JUnit hakkında daha fazla bilgi edinmek için lütfen Eğitim Noktasındaki JUnit Eğitimine bakın.

Mockito, yöntemleri kullanarak sahte bir nesneye bir işlevsellik ekler when(). Aşağıdaki kod parçacığına bir göz atın.

//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);

Burada, Mockito'ya 10 ve 20 ekleme davranışını vermesi talimatını verdik. add yöntemi calcService ve sonuç olarak 30,00 değerini döndürmek için.

Bu noktada, Mock davranışı kaydetti ve çalışan bir sahte nesneydi.

//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\>Mockito_WORKSPACE test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

Mockito, bir sahte yöntemin gerekli argümanlarla çağrılıp çağrılmadığını garanti edebilir. Kullanılarak yapılırverify()yöntem. Aşağıdaki kod parçacığına bir göz atın.

//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);

Örnek - aynı bağımsız değişkenlerle doğrulayın ()

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

Örnek - farklı argümanlarla doğrulayın ()

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

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, belirli bir yöntemde yapılabilecek arama sayısı hakkında özel bir kontrol sağlar. MathApplication'ın CalculatorService.serviceUsed () yöntemini yalnızca bir kez çağırması gerektiğini, ardından CalculatorService.serviceUsed () öğesini birden çok kez çağıramayacağını varsayalım.

//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 arayüzünü aşağıdaki gibi oluşturun.

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);
}

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

Mockito, beklenen arama sayılarını değiştirmek için aşağıdaki ek yöntemleri sağlar.

  • atLeast (int min) - min aramaları bekliyor.

  • atLeastOnce () - en az bir arama bekliyor.

  • atMost (int max) - maksimum çağrı bekliyor.

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

Mockito, istisnalar atma yeteneği sağlar, böylece istisna işleme test edilebilir. Aşağıdaki kod parçacığına bir göz atın.

//add the behavior to throw exception
doThrow(new Runtime Exception("divide operation not implemented"))
   .when(calcService).add(10.0,20.0);

Burada sahte bir nesneye bir istisna cümlesi ekledik. MathApplication, add yöntemini kullanarak calcService'i kullanır ve sahte, calcService.add () yöntemi her çağrıldığında bir RuntimeException oluşturur.

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

testAdd(MathApplicationTester): Add operation not implemented
false

Şimdiye kadar, taklitler oluşturmak için ek açıklamalar kullandık. Mockito, sahte nesneler oluşturmak için çeşitli yöntemler sağlar. mock (), mock'un eylemi sırasında yapacağı yöntem çağrılarının sırası ile uğraşmadan taklitler oluşturur.

Sözdizimi

calcService = mock(CalculatorService.class);

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

Burada, when () yoluyla sahte nesneye add () ve subtract () olmak üzere iki sahte yöntem çağrısı ekledik. Ancak test sırasında, add () çağrılmadan önce subtract () adını verdik. Create () kullanarak bir sahte nesne oluşturduğumuzda, yöntemin çalıştırılma sırası önemli değildir.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

Mockito, mock'un eylemi sırasında yapacağı yöntem çağrılarının sırasına dikkat eden Inorder sınıfını sağlar.

Sözdizimi

//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);

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

Burada, when () yoluyla sahte nesneye add () ve subtract () olmak üzere iki sahte yöntem çağrısı ekledik. Ancak test sırasında, add () çağrılmadan önce subtract () adını verdik. Mockito kullanarak sahte bir nesne oluşturduğumuzda, yöntemin çalıştırılma sırası önemli değildir. InOrder sınıfını kullanarak çağrı sırasını sağlayabiliriz.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

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, genel arayüzle stubing yapılmasına izin veren bir Cevap arayüzü sağlar.

Sözdizimi

//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;
   }
});

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

Burada, bir sahte yöntem çağrısı ekledik, yani when () yoluyla sahte nesneye ekleyin (). Ancak test sırasında, add () çağrılmadan önce subtract () adını verdik. Mockito.createStrictMock () kullanarak bir sahte nesne oluşturduğumuzda, yöntemin çalıştırılma sırası önemlidir.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

Mockito, gerçek nesneler üzerinde casus oluşturma seçeneği sunar. Casus çağrıldığında, gerçek nesnenin gerçek yöntemi çağrılır.

Sözdizimi

//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);

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

Burada, bir sahte yöntem çağrısı ekledik, yani when () yoluyla sahte nesneye ekleyin (). Ancak test sırasında, add () çağrılmadan önce subtract () adını verdik. Mockito.createStrictMock () kullanarak bir sahte nesne oluşturduğumuzda, yöntemin çalıştırılma sırası önemlidir.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

Mockito, daha sonra yeniden kullanılabilmesi için bir taklidi sıfırlama yeteneği sağlar. Aşağıdaki kod parçacığına bir göz atın.

//reset mock
reset(calcService);

Burada sahte nesneyi sıfırladık. MathApplication calcService'i kullanır ve taklidi sıfırladıktan sonra alay yöntemi kullanmak testi geçemez.

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

testAddAndSubtract(MathApplicationTester): expected:<0.0> but was:<30.0>
false

Davranış Odaklı Geliştirme, testlerin kullandığı bir yazma tarzıdır given, when ve thenformat test yöntemleri olarak. Mockito bunu yapmak için özel yöntemler sunar. Aşağıdaki kod parçacığına bir göz atın.

//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);

Burada kullanıyoruz given yerine BDDMockito sınıfı yöntemi when yöntemi.

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true

Mockito, öngörülen zaman çerçevesi içinde bir yöntemin çağrılıp çağrılmadığını test etmek için özel bir Zaman Aşımı seçeneği sunar.

Sözdizimi

//passes when add() is called within 100 ms.
verify(calcService,timeout(100)).add(20.0,10.0);

Misal

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

MathApplication sınıfını, içine bir calculatorService taklidi enjekte ederek test edelim. Mock, Mockito tarafından oluşturulacak.

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

TestRunner adlı bir java sınıf dosyası oluşturun. C:\> Mockito_WORKSPACE Test senaryolarını yürütmek için.

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

Kullanarak sınıfları derleyin javac aşağıdaki gibi derleyici -

C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
   java MathApplicationTester.java TestRunner.java

Şimdi sonucu görmek için Test Çalıştırıcısını çalıştırın -

C:\Mockito_WORKSPACE>java TestRunner

Çıkışı doğrulayın.

true