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 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
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