Mockito-クイックガイド
モックとは何ですか?
モックは、クラスの機能を分離してテストする方法です。モックは、機能をテストするためにデータベース接続やプロパティファイルの読み取りまたはファイルサーバーの読み取りを必要としません。モックオブジェクトは、実際のサービスのモックを実行します。モックオブジェクトは、渡されたダミー入力に対応するダミーデータを返します。
モッキート
Mockitoは、モックオブジェクトのシームレスな作成を容易にします。特定のインターフェースのモックオブジェクトを作成するためにJavaReflectionを使用します。モックオブジェクトは、実際の実装のプロキシに他なりません。
株式の価格の詳細を返すストックサービスのケースを考えてみましょう。開発中は、実際のストックサービスを使用してリアルタイムデータを取得することはできません。したがって、ストックサービスのダミー実装が必要です。Mockitoは、その名前が示すように、同じことを非常に簡単に行うことができます。
Mockitoの利点
No Handwriting −モックオブジェクトを自分で作成する必要はありません。
Refactoring Safe −モックは実行時に作成されるため、インターフェイスメソッド名の名前を変更したり、パラメータを並べ替えたりしても、テストコードが破損することはありません。
Return value support −戻り値をサポートします。
Exception support −例外をサポートします。
Order check support −メソッド呼び出しの順序のチェックをサポートします。
Annotation support −アノテーションを使用したモックの作成をサポートします。
次のコードスニペットについて考えてみます。
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);
}
}
上記のプログラムの重要な概念を理解しましょう。完全なコードはこの章にありますFirst Application。
Portfolio −株式のリストを保持し、株価と在庫数量を使用して計算された市場価値を取得するオブジェクト。
Stock − ID、名前、数量など、株式の詳細を運ぶオブジェクト。
StockService −株式サービスは、株式の現在の価格を返します。
mock(...) −Mockitoはストックサービスのモックを作成しました。
when(...).thenReturn(...)−stockServiceインターフェースのgetPriceメソッドのモック実装。googleStockの場合、価格として50.00を返します。
portfolio.setStocks(...) −ポートフォリオに2つの株式のリストが含まれるようになりました。
portfolio.setStockService(...) − stockServiceMockオブジェクトをポートフォリオに割り当てます。
portfolio.getMarketValue() −ポートフォリオは、模擬株式サービスを使用して、その株式に基づいて市場価値を返します。
MockitoはJavaのフレームワークであるため、最初の要件はJDKをマシンにインストールすることです。
システム要件
JDK | 1.5以上。 |
---|---|
記憶 | 最小要件はありません。 |
ディスクスペース | 最小要件はありません。 |
オペレーティング・システム | 最小要件はありません。 |
Step 1 − Verify Java Installation on Your Machine
コンソールを開き、以下を実行します java コマンド。
OS | 仕事 | コマンド |
---|---|---|
ウィンドウズ | コマンドコンソールを開く | c:\> java -version |
Linux | コマンドターミナルを開く | $ java -version |
マック | オープンターミナル | マシン:> joseph $ java -version |
すべてのオペレーティングシステムの出力を確認しましょう-
OS | 出力 |
---|---|
ウィンドウズ | Javaバージョン "1.6.0_21" Java(TM)SEランタイム環境(ビルド1.6.0_21-b07) Java HotSpot(TM)クライアントVM(ビルド17.0-b17、混合モード、共有) |
Linux | Javaバージョン "1.6.0_21" Java(TM)SEランタイム環境(ビルド1.6.0_21-b07) Java HotSpot(TM)クライアントVM(ビルド17.0-b17、混合モード、共有) |
マック | Javaバージョン "1.6.0_21" Java(TM)SEランタイム環境(ビルド1.6.0_21-b07) Java HotSpot(TM)64ビットサーバーVM(ビルド17.0-b17、混合モード、共有) |
Javaがインストールされていない場合、Javaソフトウェア開発キット(SDK)をインストールするには、ここをクリックしてください。
このチュートリアルでは、システムにJava1.6.0_21がインストールされていることを前提としています。
Step 2 − Set JAVA Environment
をセットする JAVA_HOMEJavaがマシンにインストールされているベースディレクトリの場所を指す環境変数。例えば、
OS | 出力 |
---|---|
ウィンドウズ | 環境変数JAVA_HOMEをC:\ Program Files \ Java \ jdk1.6.0_21に設定します |
Linux | エクスポートJAVA_HOME = / usr / local / java-current |
マック | エクスポートJAVA_HOME = / Library / Java / Home |
Javaコンパイラの場所をシステムパスに追加します。
OS | 出力 |
---|---|
ウィンドウズ | 文字列; C:\ Program Files \ Java \ jdk1.6.0_21 \ binをシステム変数Pathの最後に追加します。 |
Linux | export PATH = $ PATH:$ JAVA_HOME / bin / |
マック | 必要ありません |
コマンドを使用してJavaのインストールを確認する java -version 上で説明したように。
Step 3 − Download Mockito-All Archive
MavenリポジトリからMockitoの最新バージョンをダウンロードするには、ここをクリックしてください。
jarファイルをCドライブに保存します。たとえば、C:\> Mockitoです。
OS | アーカイブ名 |
---|---|
ウィンドウズ | mockito-all-2.0.2-beta.jar |
Linux | mockito-all-2.0.2-beta.jar |
マック | mockito-all-2.0.2-beta.jar |
Step 4 − Set Mockito Environment
をセットする Mockito_HOMEMockitoおよび依存関係jarがマシンに格納されているベースディレクトリの場所を指す環境変数。次の表は、mockito-all-2.0.2-beta.jarをC:\> Mockitoフォルダーに抽出したと仮定して、さまざまなオペレーティングシステムで環境変数を設定する方法を示しています。
OS | 出力 |
---|---|
ウィンドウズ | 環境変数Mockito_HOMEをC:\ Mockitoに設定します |
Linux | Mockito_HOME = / usr / local / Mockitoをエクスポートします |
マック | Mockito_HOME = / Library / Mockitoをエクスポートします |
Step 5 − Set CLASSPATH Variable
をセットする CLASSPATHMockitojarが格納されている場所を指す環境変数。次の表は、さまざまなオペレーティングシステムでCLASSPATH変数を設定する方法を示しています。
OS | 出力 |
---|---|
ウィンドウズ | 環境変数CLASSPATHを%CLASSPATH%;%Mockito_HOME%\ mockito-all-2.0.2-beta.jar;。;に設定します。 |
Linux | export CLASSPATH = $ CLASSPATH:$ Mockito_HOME /mockito-all-2.0.2-beta.jar:。 |
マック | export CLASSPATH = $ CLASSPATH:$ Mockito_HOME /mockito-all-2.0.2-beta.jar:。 |
Step 6 − Download JUnit Archive
Githubから最新バージョンのJUnitjarファイルをダウンロードします。フォルダをC:\> Junitの場所に保存します。
OS | アーカイブ名 |
---|---|
ウィンドウズ | junit4.11.jar、hamcrest-core-1.2.1.jar |
Linux | junit4.11.jar、hamcrest-core-1.2.1.jar |
マック | junit4.11.jar、hamcrest-core-1.2.1.jar |
Step 7 − Set JUnit Environment
をセットする JUNIT_HOMEJUnitjarがマシンに格納されているベースディレクトリの場所を指す環境変数。次の表は、junit4.11.jarとhamcrest-core-1.2.1.jarをC:\> Junitに格納したと仮定して、さまざまなオペレーティングシステムでこの環境変数を設定する方法を示しています。
OS | 出力 |
---|---|
ウィンドウズ | 環境変数JUNIT_HOMEをC:\ JUNITに設定します |
Linux | JUNIT_HOME = / usr / local / JUNITをエクスポートします |
マック | JUNIT_HOME = / Library / JUNITをエクスポートします |
Step 8 − Set CLASSPATH Variable
JUNITjarの場所を指すようにCLASSPATH環境変数を設定します。次の表は、さまざまなオペレーティングシステムでどのように実行されるかを示しています。
OS | 出力 |
---|---|
ウィンドウズ | 環境変数CLASSPATHを%CLASSPATH%;%JUNIT_HOME%\ junit4.11.jar;%JUNIT_HOME%\ hamcrest-core-1.2.1.jar;。;に設定します。 |
Linux | export CLASSPATH = $ CLASSPATH:$ JUNIT_HOME / junit4.11.jar:$ JUNIT_HOME /hamcrest-core-1.2.1.jar:。 |
マック | export CLASSPATH = $ CLASSPATH:$ JUNIT_HOME / junit4.11.jar:$ JUNIT_HOME /hamcrest-core-1.2.1.jar:。 |
Mockitoフレームワークの詳細に入る前に、アプリケーションの動作を見てみましょう。この例では、いくつかの株式のダミー価格を取得するためにStock Serviceのモックを作成し、Portfolioという名前のJavaクラスを単体テストしました。
このプロセスについては、以下で段階的に説明します。
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
ストックサービスのモックを注入して、Portfolioクラスをテストしてみましょう。モックはMockitoによって作成されます。
File: PortfolioTester.java
package com.tutorialspoint.mock;
import java.util.ArrayList;
import java.util.List;
import static org.mockito.Mockito.*;
public class PortfolioTester {
Portfolio portfolio;
StockService stockService;
public static void main(String[] args){
PortfolioTester tester = new PortfolioTester();
tester.setUp();
System.out.println(tester.testMarketValue()?"pass":"fail");
}
public void setUp(){
//Create a portfolio object which is to be tested
portfolio = new Portfolio();
//Create the mock object of stock service
stockService = mock(StockService.class);
//set the stockService to the portfolio
portfolio.setStockService(stockService);
}
public boolean testMarketValue(){
//Creates a list of stocks to be added to the portfolio
List<Stock> stocks = new ArrayList<Stock>();
Stock googleStock = new Stock("1","Google", 10);
Stock microsoftStock = new Stock("2","Microsoft",100);
stocks.add(googleStock);
stocks.add(microsoftStock);
//add stocks to the portfolio
portfolio.setStocks(stocks);
//mock the behavior of stock service to return the value of various stocks
when(stockService.getPrice(googleStock)).thenReturn(50.00);
when(stockService.getPrice(microsoftStock)).thenReturn(1000.00);
double marketValue = portfolio.getMarketValue();
return marketValue == 100500.0;
}
}
Step 5 − Verify the result
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac Stock.java StockService.java Portfolio.java PortfolioTester.java
次に、PortfolioTesterを実行して結果を確認します-
C:\Mockito_WORKSPACE>java PortfolioTester
出力を確認する
pass
この章では、JUnitとMockitoを統合する方法を学習します。ここでは、CalculatorServiceを使用して、加算、減算、乗算、除算などの基本的な数学演算を実行する数学アプリケーションを作成します。
Mockitoを使用して、CalculatorServiceのダミー実装をモックします。さらに、JUnitとMockitoの両方との互換性を示すために、アノテーションを多用しました。
このプロセスについては、以下で段階的に説明します。
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
//@InjectMocks annotation is used to create and inject the mock object
@InjectMocks
MathApplication mathApplication = new MathApplication();
//@Mock annotation is used to create the mock object to be injected
@Mock
CalculatorService calcService;
@Test
public void testAdd(){
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
//test the add functionality
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
}
}
Step 4 − Create a class to execute to test cases
TestRunnerという名前のJavaクラスファイルをで作成します C> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
JUnitの詳細については、チュートリアルポイントのJUnitチュートリアルを参照してください。
Mockitoは、メソッドを使用してモックオブジェクトに機能を追加します when()。次のコードスニペットを見てください。
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
ここでは、Mockitoに10と20を追加する動作を与えるように指示しました。 add の方法 calcService その結果、30.00の値を返します。
この時点で、モックは動作を記録し、動作するモックオブジェクトです。
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
//@InjectMocks annotation is used to create and inject the mock object
@InjectMocks
MathApplication mathApplication = new MathApplication();
//@Mock annotation is used to create the mock object to be injected
@Mock
CalculatorService calcService;
@Test
public void testAdd(){
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
//test the add functionality
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\>Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
Mockitoは、必要な引数を使用してモックメソッドが呼び出されているかどうかを確認できます。それはを使用して行われますverify()方法。次のコードスニペットを見てください。
//test the add functionality
Assert.assertEquals(calcService.add(10.0, 20.0),30.0,0);
//verify call to calcService is made or not with same arguments.
verify(calcService).add(10.0, 20.0);
例-同じ引数を持つverify()
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
//@InjectMocks annotation is used to create and inject the mock object
@InjectMocks
MathApplication mathApplication = new MathApplication();
//@Mock annotation is used to create the mock object to be injected
@Mock
CalculatorService calcService;
@Test
public void testAdd(){
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
//test the add functionality
Assert.assertEquals(calcService.add(10.0, 20.0),30.0,0);
//verify the behavior
verify(calcService).add(10.0, 20.0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
例-異なる引数を持つverify()
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
//@InjectMocks annotation is used to create and inject the mock object
@InjectMocks
MathApplication mathApplication = new MathApplication();
//@Mock annotation is used to create the mock object to be injected
@Mock
CalculatorService calcService;
@Test
public void testAdd(){
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
//test the add functionality
Assert.assertEquals(calcService.add(10.0, 20.0),30.0,0);
//verify the behavior
verify(calcService).add(20.0, 30.0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
testAdd(MathApplicationTester):
Argument(s) are different! Wanted:
calcService.add(20.0, 30.0);
-> at MathApplicationTester.testAdd(MathApplicationTester.java:32)
Actual invocation has different arguments:
calcService.add(10.0, 20.0);
-> at MathApplication.add(MathApplication.java:10)
false
Mockitoは、特定のメソッドで実行できる呼び出しの数に関する特別なチェックを提供します。MathApplicationがCalculatorService.serviceUsed()メソッドを1回だけ呼び出す必要があるとすると、CalculatorService.serviceUsed()を複数回呼び出すことはできません。
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
//limit the method call to 1, no less and no more calls are allowed
verify(calcService, times(1)).add(10.0, 20.0);
次のようにCalculatorServiceインターフェイスを作成します。
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 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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.never;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
//@InjectMocks annotation is used to create and inject the mock object
@InjectMocks
MathApplication mathApplication = new MathApplication();
//@Mock annotation is used to create the mock object to be injected
@Mock
CalculatorService calcService;
@Test
public void testAdd(){
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
//add the behavior of calc service to subtract two numbers
when(calcService.subtract(20.0,10.0)).thenReturn(10.00);
//test the add functionality
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
//test the subtract functionality
Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0.0);
//default call count is 1
verify(calcService).subtract(20.0, 10.0);
//check if add function is called three times
verify(calcService, times(3)).add(10.0, 20.0);
//verify that method was never called on a mock
verify(calcService, never()).multiply(10.0,20.0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
Mockitoは、予想される呼び出し数を変更するために、次の追加のメソッドを提供します。
atLeast (int min) −最小呼び出しが必要です。
atLeastOnce () −少なくとも1回の呼び出しが必要です。
atMost (int max) −最大呼び出しを期待します。
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.atMost;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
//@InjectMocks annotation is used to create and inject the mock object
@InjectMocks
MathApplication mathApplication = new MathApplication();
//@Mock annotation is used to create the mock object to be injected
@Mock
CalculatorService calcService;
@Test
public void testAdd(){
//add the behavior of calc service to add two numbers
when(calcService.add(10.0,20.0)).thenReturn(30.00);
//add the behavior of calc service to subtract two numbers
when(calcService.subtract(20.0,10.0)).thenReturn(10.00);
//test the add functionality
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
//test the subtract functionality
Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0.0);
//check a minimum 1 call count
verify(calcService, atLeastOnce()).subtract(20.0, 10.0);
//check if add function is called minimum 2 times
verify(calcService, atLeast(2)).add(10.0, 20.0);
//check if add function is called maximum 3 times
verify(calcService, atMost(3)).add(10.0,20.0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行する
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
Mockitoは、モックに例外をスローする機能を提供するため、例外処理をテストできます。次のコードスニペットを見てください。
//add the behavior to throw exception
doThrow(new Runtime Exception("divide operation not implemented"))
.when(calcService).add(10.0,20.0);
ここでは、モックオブジェクトに例外句を追加しました。MathApplicationはそのaddメソッドを使用してcalcServiceを利用し、モックはcalcService.add()メソッドが呼び出されるたびにRuntimeExceptionをスローします。
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
import static org.mockito.Mockito.doThrow;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoRunner.class)
public class MathApplicationTester {
// @TestSubject annotation is used to identify class
which is going to use the mock object
@TestSubject
MathApplication mathApplication = new MathApplication();
//@Mock annotation is used to create the mock object to be injected
@Mock
CalculatorService calcService;
@Test(expected = RuntimeException.class)
public void testAdd(){
//add the behavior to throw exception
doThrow(new RuntimeException("Add operation not implemented"))
.when(calcService).add(10.0,20.0);
//test the add functionality
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
testAdd(MathApplicationTester): Add operation not implemented
false
これまで、アノテーションを使用してモックを作成してきました。Mockitoは、モックオブジェクトを作成するためのさまざまなメソッドを提供します。mock()は、モックがアクションの過程で行うメソッド呼び出しの順序を気にせずにモックを作成します。
構文
calcService = mock(CalculatorService.class);
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
ここでは、when()を介して2つのモックメソッド呼び出しadd()とsubtract()をモックオブジェクトに追加しました。ただし、テスト中は、add()を呼び出す前にsubtract()を呼び出しました。create()を使用してモックオブジェクトを作成する場合、メソッドの実行順序は重要ではありません。
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という名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
Mockitoは、モックがアクションの過程で行うメソッド呼び出しの順序を処理するInorderクラスを提供します。
構文
//create an inOrder verifier for a single mock
InOrder inOrder = inOrder(calcService);
//following will make sure that add is first called then subtract is called.
inOrder.verify(calcService).add(20.0,10.0);
inOrder.verify(calcService).subtract(20.0,10.0);
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
ここでは、when()を介して2つのモックメソッド呼び出しadd()とsubtract()をモックオブジェクトに追加しました。ただし、テスト中は、add()を呼び出す前にsubtract()を呼び出しました。Mockitoを使用してモックオブジェクトを作成する場合、メソッドの実行順序は重要ではありません。InOrderクラスを使用すると、呼び出し順序を確認できます。
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という名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
testAddAndSubtract(MathApplicationTester):
Verification in order failure
Wanted but not invoked:
calculatorService.add(20.0, 10.0);
-> at MathApplicationTester.testAddAndSubtract(MathApplicationTester.java:48)
Wanted anywhere AFTER following interaction:
calculatorService.subtract(20.0, 10.0);
-> at MathApplication.subtract(MathApplication.java:13)
false
Mockitoは、汎用インターフェースでスタブ化できるAnswerインターフェースを提供します。
構文
//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;
}
});
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
ここでは、1つのモックメソッド呼び出しadd()をwhen()を介してモックオブジェクトに追加しました。ただし、テスト中は、add()を呼び出す前にsubtract()を呼び出しました。Mockito.createStrictMock()を使用してモックオブジェクトを作成する場合、メソッドの実行順序は重要です。
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という名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
Mockitoは、実際のオブジェクトにスパイを作成するオプションを提供します。スパイが呼び出されると、実際のオブジェクトの実際のメソッドが呼び出されます。
構文
//create a spy on actual object
calcService = spy(calculator);
//perform operation on real object
//test the add functionality
Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
ここでは、1つのモックメソッド呼び出しadd()をwhen()を介してモックオブジェクトに追加しました。ただし、テスト中は、add()を呼び出す前にsubtract()を呼び出しました。Mockito.createStrictMock()を使用してモックオブジェクトを作成する場合、メソッドの実行順序は重要です。
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という名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
Mockitoは、後で再利用できるようにモックをリセットする機能を提供します。次のコードスニペットを見てください。
//reset mock
reset(calcService);
ここで、モックオブジェクトをリセットしました。MathApplicationはcalcServiceを利用し、モックをリセットした後、モックメソッドを使用するとテストに失敗します。
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
package com.tutorialspoint.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.reset;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
private MathApplication mathApplication;
private CalculatorService calcService;
@Before
public void setUp(){
mathApplication = new MathApplication();
calcService = mock(CalculatorService.class);
mathApplication.setCalculatorService(calcService);
}
@Test
public void testAddAndSubtract(){
//add the behavior to add numbers
when(calcService.add(20.0,10.0)).thenReturn(30.0);
//test the add functionality
Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);
//reset the mock
reset(calcService);
//test the add functionality after resetting the mock
Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
testAddAndSubtract(MathApplicationTester): expected:<0.0> but was:<30.0>
false
ビヘイビア駆動開発は、テストで使用するライティングのスタイルです。 given、 when そして thenテストメソッドとしてのフォーマット。Mockitoは、そうするための特別な方法を提供します。次のコードスニペットを見てください。
//Given
given(calcService.add(20.0,10.0)).willReturn(30.0);
//when
double result = calcService.add(20.0,10.0);
//then
Assert.assertEquals(result,30.0,0);
ここでは使用しています given 代わりにBDDMockitoクラスのメソッド when の方法。
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
package com.tutorialspoint.mock;
import static org.mockito.BDDMockito.*;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
private MathApplication mathApplication;
private CalculatorService calcService;
@Before
public void setUp(){
mathApplication = new MathApplication();
calcService = mock(CalculatorService.class);
mathApplication.setCalculatorService(calcService);
}
@Test
public void testAdd(){
//Given
given(calcService.add(20.0,10.0)).willReturn(30.0);
//when
double result = calcService.add(20.0,10.0);
//then
Assert.assertEquals(result,30.0,0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true
Mockitoには、指定された時間枠内にメソッドが呼び出されたかどうかをテストするための特別なタイムアウトオプションが用意されています。
構文
//passes when add() is called within 100 ms.
verify(calcService,timeout(100)).add(20.0,10.0);
例
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クラスをテストしてみましょう。モックはMockitoによって作成されます。
File: MathApplicationTester.java
package com.tutorialspoint.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.runners.MockitoJUnitRunner;
// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(MockitoJUnitRunner.class)
public class MathApplicationTester {
private MathApplication mathApplication;
private CalculatorService calcService;
@Before
public void setUp(){
mathApplication = new MathApplication();
calcService = mock(CalculatorService.class);
mathApplication.setCalculatorService(calcService);
}
@Test
public void testAddAndSubtract(){
//add the behavior to add numbers
when(calcService.add(20.0,10.0)).thenReturn(30.0);
//subtract the behavior to subtract numbers
when(calcService.subtract(20.0,10.0)).thenReturn(10.0);
//test the subtract functionality
Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0);
//test the add functionality
Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);
//verify call to add method to be completed within 100 ms
verify(calcService, timeout(100)).add(20.0,10.0);
//invocation count can be added to ensure multiplication invocations
//can be checked within given timeframe
verify(calcService, timeout(100).times(1)).subtract(20.0,10.0);
}
}
Step 4 − Execute test cases
TestRunnerという名前のJavaクラスファイルをで作成します C:\> Mockito_WORKSPACE テストケースを実行します。
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
を使用してクラスをコンパイルします javac 次のようにコンパイラ-
C:\Mockito_WORKSPACE>javac CalculatorService.java MathApplication.
java MathApplicationTester.java TestRunner.java
次に、テストランナーを実行して結果を確認します-
C:\Mockito_WORKSPACE>java TestRunner
出力を確認します。
true