Mockito-quick-guide
Mockito-概要
モッキングとは何ですか?
モッキングは、クラスの機能を単独でテストする方法です。 モックでは、機能をテストするためにデータベース接続やプロパティファイルの読み取りやファイルサーバーの読み取りは必要ありません。 モックオブジェクトは、実際のサービスのモックを行います。 モックオブジェクトは、渡されたダミー入力に対応するダミーデータを返します。
モッキート
Mockitoは、モックオブジェクトのシームレスな作成を容易にします。 Java Reflectionを使用して、特定のインターフェイスのモックオブジェクトを作成します。 モックオブジェクトは、実際の実装のプロキシにすぎません。
株式の価格の詳細を返す株式サービスの場合を考えてみましょう。 開発中、実際のストックサービスを使用してリアルタイムデータを取得することはできません。 そのため、ストックサービスのダミー実装が必要です。 Mockitoは、その名前が示すように、同じことを非常に簡単に行うことができます。
Mockitoの利点
- 手書きなし-自分でモックオブジェクトを書く必要はありません。
- リファクタリングセーフ-実行時にMocksが作成されるため、インターフェイスメソッドの名前を変更したり、パラメーターを並べ替えたりしても、テストコードが破損することはありません。
- 戻り値のサポート-戻り値をサポートします。
- 例外サポート-例外をサポートします。
- 順序チェックのサポート-メソッド呼び出しの順序のチェックをサポートします。
- 注釈のサポート-注釈を使用したモックの作成をサポートします。
次のコードスニペットを考えてください。
上記のプログラムの重要な概念を理解しましょう。 完全なコードは、 _ First Application_ の章で入手できます。
- ポートフォリオ-株式のリストを保持し、株価と在庫量を使用して計算された市場価値を取得するオブジェクト。
- ストック-ID、名前、数量など、ストックの詳細を保持するオブジェクト。
- StockService -株式サービスは、株式の現在の価格を返します。
- * mock(…)*-Mockitoはストックサービスのモックを作成しました。
- * when(…)。thenReturn(…)*-stockServiceインターフェイスのgetPriceメソッドのモック実装。 googleStockの場合、価格として50.00を返します。
- * portfolio.setStocks(…)*-ポートフォリオには2つの銘柄のリストが含まれるようになりました。
- * portfolio.setStockService(…)*-stockService Mockオブジェクトをポートフォリオに割り当てます。
- * portfolio.getMarketValue()*-ポートフォリオは、模擬株式サービスを使用して、株式に基づいて市場価値を返します。
Mockito-環境設定
MockitoはJavaのフレームワークであるため、最初の要件はJDKをマシンにインストールすることです。
システム要件
JDK | 1.5 or above. |
Memory | no minimum requirement. |
Disk Space | no minimum requirement. |
Operating System | no minimum requirement. |
ステップ1-マシンでのJavaインストールの検証
コンソールを開き、次の java コマンドを実行します。
OS | Task | Command |
---|---|---|
Windows | Open Command Console | c:\> java -version |
Linux | Open Command Terminal | $ java -version |
Mac | Open Terminal | machine:> joseph$ java -version |
すべてのオペレーティングシステムの出力を確認しましょう-
OS | Output |
---|---|
Windows |
java version "1.6.0_21" Java(TM)SEランタイム環境(ビルド1.6.0_21-b07) Java HotSpot(TM)Client VM(ビルド17.0-b17、混合モード、共有) |
Linux |
java version "1.6.0_21" Java(TM)SEランタイム環境(ビルド1.6.0_21-b07) Java HotSpot(TM)Client VM(ビルド17.0-b17、混合モード、共有) |
Mac |
java version "1.6.0_21" Java(TM)SEランタイム環境(ビルド1.6.0_21-b07) Java HotSpot(TM)64ビットサーバーVM(ビルド17.0-b17、混合モード、共有) |
Javaをインストールしていない場合、Java Software Development Kit(SDK)をインストールするにはhttp://www.oracle.com/technetwork/java/javase/downloads/indexl [ここをクリック]
このチュートリアルでは、システムにJava 1.6.0_21がインストールされていると想定しています。
ステップ2-JAVA環境の設定
OS | Output |
---|---|
Windows | Set the environment variable JAVA_HOME to C:\Program Files\Java\jdk1.6.0_21 |
Linux | export JAVA_HOME=/usr/local/java-current |
Mac | export JAVA_HOME=/Library/Java/Home |
Javaコンパイラの場所をシステムパスに追加します。
OS | Output |
---|---|
Windows | Append the string ;C:\Program Files\Java\jdk1.6.0_21\bin to the end of the system variable, Path. |
Linux | export PATH=$PATH:$JAVA_HOME/bin/ |
Mac | not required |
上記の説明に従って、コマンド java -version を使用してJavaインストールを確認します。
ステップ3-Mockito-Allアーカイブのダウンロード
MavenリポジトリからMockitoの最新バージョンをダウンロードするにはhttp://mvnrepository.com/artifact/org.mockito/mockito-all/2.0.2-beta [ここをクリックしてください。]
Cドライブにjarファイルを保存します。C:\> Mockitoのようにします。
OS | Archive name |
---|---|
Windows | mockito-all-2.0.2-beta.jar |
Linux | mockito-all-2.0.2-beta.jar |
Mac | mockito-all-2.0.2-beta.jar |
ステップ4-Mockito環境の設定
OS | Output |
---|---|
Windows | Set the environment variable Mockito_HOME to C:\Mockito |
Linux | export Mockito_HOME=/usr/local/Mockito |
Mac | export Mockito_HOME=/Library/Mockito |
ステップ5-CLASSPATH変数の設定
OS | Output |
---|---|
Windows | Set the environment variable CLASSPATH to %CLASSPATH%;%Mockito_HOME%\mockito-all-2.0.2-beta.jar;.; |
Linux | export CLASSPATH=$CLASSPATH:$Mockito_HOME/mockito-all-2.0.2-beta.jar:. |
Mac | export CLASSPATH=$CLASSPATH:$Mockito_HOME/mockito-all-2.0.2-beta.jar:. |
ステップ6-JUnitアーカイブのダウンロード
GithubからJUnit jarファイルの最新バージョンをダウンロードします。 C:\> Junitの場所にフォルダーを保存します。
OS | Archive name |
---|---|
Windows | 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 |
ステップ7-JUnit環境の設定
OS | Output |
---|---|
Windows | Set the environment variable JUNIT_HOME to C:\JUNIT |
Linux | export JUNIT_HOME=/usr/local/JUNIT |
Mac | export JUNIT_HOME=/Library/JUNIT |
ステップ8-CLASSPATH変数の設定
JUNIT jarの場所を指すようにCLASSPATH環境変数を設定します。 次の表は、さまざまなオペレーティングシステムでどのように実行されるかを示しています。
OS | Output |
---|---|
Windows | Set the environment variable CLASSPATH to %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:. |
Mac | export CLASSPATH=$CLASSPATH:$JUNIT_HOME/junit4.11.jar:$JUNIT_HOME/hamcrest-core-1.2.1.jar:. |
Mockito-最初のアプリケーション
Mockitoフレームワークの詳細に入る前に、実際に動作しているアプリケーションを見てみましょう。 この例では、一部の株式のダミー価格を取得するためにストックサービスのモックを作成し、Portfolioという名前のJavaクラスを単体テストしました。
このプロセスについては、ステップごとに説明します。
ステップ1-Stockを表すJAVAクラスを作成します
ステップ2-株価を取得するインターフェースStockServiceを作成する
ステップ3-クライアントのポートフォリオを表すクラスポートフォリオを作成します
ステップ4-ポートフォリオクラスのテスト
Stockserviceのモックを注入して、Portfolioクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、結果を確認するためにPortfolioTesterを実行します-
出力を確認する
Mockito-JUnit統合
この章では、JUnitとMockitoを統合する方法を学びます。 ここでは、CalculatorServiceを使用して加算、減算、乗算、除算などの基本的な数学演算を実行する数学アプリケーションを作成します。
Mockitoを使用して、CalculatorServiceのダミー実装をモックします。 さらに、アノテーションを広範囲に使用して、JUnitとMockitoの両方との互換性を紹介しました。
このプロセスについては、ステップごとに説明します。
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースに実行するクラスを作成します
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
JUnitの詳細については、チュートリアルポイントのJUnitチュートリアルを参照してください。
Mockito-動作の追加
Mockitoは、* when()*メソッドを使用して、モックオブジェクトに機能を追加します。 次のコードスニペットをご覧ください。
ここでは、Mockitoに、 calcService の add メソッドに10と20を追加する動作を与え、その結果、30.00の値を返すように指示しました。
この時点で、モックは動作を記録し、動作するモックオブジェクトです。
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-動作の検証
Mockitoは、モックメソッドが必要な引数で呼び出されているかどうかを確認できます。 * verify()*メソッドを使用して行われます。 次のコードスニペットをご覧ください。
例-同じ引数を持つverify()
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
テストランナーを実行して結果を確認します
出力を確認します。
例-異なる引数を持つverify()
ステップ1-数学関数を提供するCalculatorCalcServiceインターフェイスを作成します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-コールを期待
Mockitoは、特定のメソッドで実行できる呼び出しの数に特別なチェックを提供します。 MathApplicationがCalculatorService.serviceUsed()メソッドを1回だけ呼び出す必要があり、CalculatorService.serviceUsed()を複数回呼び出すことができないと仮定します。
次のようにCalculatorServiceインターフェースを作成します。
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-さまざまな呼び出し
Mockitoは、予想されるコールカウントを変えるために、次の追加メソッドを提供します。
- * atLeast(int min)*-最小の呼び出しを想定しています。
- * atLeastOnce()*-少なくとも1つの呼び出しが必要です。
- * atMost(int max)*-最大呼び出しを期待します。
例
ステップ1-数学関数を提供するCalculatorCalcServiceインターフェイスを作成します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-例外処理
Mockitoは、モックに例外をスローする機能を提供するため、例外処理をテストできます。 次のコードスニペットをご覧ください。
ここでは、モックオブジェクトに例外節を追加しました。 MathApplicationはaddメソッドを使用してcalcServiceを使用し、calcService.add()メソッドが呼び出されるたびにモックはRuntimeExceptionをスローします。
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-モックの作成
これまで、アノテーションを使用してモックを作成してきました。 Mockitoは、モックオブジェクトを作成するためのさまざまなメソッドを提供します。 mock()は、モックがそのアクションの途中で行うメソッド呼び出しの順序を気にせずにモックを作成します。
構文
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ここでは、2つのモックメソッド呼び出しadd()とminus()をwhen()を介してモックオブジェクトに追加しました。 ただし、テスト中は、add()を呼び出す前に、subtract()を呼び出しました。 create()を使用してモックオブジェクトを作成する場合、メソッドの実行順序は重要ではありません。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-順序付けられた検証
Mockitoは、モックがそのアクションの途中で行うメソッド呼び出しの順序を処理するInorderクラスを提供します。
構文
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ここでは、2つのモックメソッド呼び出しadd()とminus()をwhen()を介してモックオブジェクトに追加しました。 ただし、テスト中は、add()を呼び出す前に、subtract()を呼び出しました。 Mockitoを使用してモックオブジェクトを作成する場合、メソッドの実行順序は重要ではありません。 InOrderクラスを使用して、呼び出し順序を確認できます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-コールバック
Mockitoは、汎用インターフェイスでのスタブを可能にするAnswerインターフェイスを提供します。
構文
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ここでは、1つのモックメソッド呼び出し、when()を介してモックオブジェクトにadd()を追加しました。 ただし、テスト中は、add()を呼び出す前に、subtract()を呼び出しました。 Mockito.createStrictMock()を使用してモックオブジェクトを作成する場合、メソッドの実行順序は重要です。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
モッキート-スパイ
Mockitoは、実際のオブジェクトにスパイを作成するオプションを提供します。 spyが呼び出されると、実際のオブジェクトの実際のメソッドが呼び出されます。
構文
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ここでは、1つのモックメソッド呼び出し、when()を介してモックオブジェクトにadd()を追加しました。 ただし、テスト中は、add()を呼び出す前に、subtract()を呼び出しました。 Mockito.createStrictMock()を使用してモックオブジェクトを作成する場合、メソッドの実行順序は重要です。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-モックのリセット
Mockitoは、後で再利用できるように、モックをリセットする機能を提供します。 次のコードスニペットをご覧ください。
ここで、モックオブジェクトをリセットしました。 MathApplicationはcalcServiceを使用し、モックをリセットした後、モックメソッドを使用するとテストが失敗します。
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-行動駆動開発
Behavior Driven Developmentは、テストメソッドとして given 、 when および then 形式を使用するテストを記述するスタイルです。 Mockitoは、そうするための特別な方法を提供します。 次のコードスニペットをご覧ください。
ここでは、 when メソッドの代わりにBDDMockitoクラスの given メソッドを使用しています。
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。
Mockito-タイムアウト
Mockitoには、規定の時間枠内でメソッドが呼び出されるかどうかをテストする特別なタイムアウトオプションがあります。
構文
例
ステップ1-CalculatorServiceというインターフェイスを作成して、数学関数を提供します
ステップ2-MathApplicationを表すJAVAクラスを作成します
ステップ3-MathApplicationクラスのテスト
calculatorServiceのモックを注入して、MathApplicationクラスをテストしましょう。 MockはMockitoによって作成されます。
ステップ4-テストケースの実行
ステップ5-結果を確認する
次のように javac コンパイラを使用してクラスをコンパイルします-
次に、テストランナーを実行して結果を確認します-
出力を確認します。