[解決済み] mockitoのwhen()呼び出しはどのように動作するのですか?
質問
次のようなMockitoの文があるとする。
when(mock.method()).thenReturn(someValue);
mock.method()ステートメントがwhen()に戻り値を渡すとすると、Mockitoはどのようにしてモックのプロキシを作成するのでしょうか?CGLibのようなものを使っていると想像していますが、技術的にどのように行われているのか知りたいです。
どのように解決するのですか?
簡単に言うと、あなたの例の場合、結果は
mock.method()
mockito では、プロキシ、メソッドのインターセプト、および
MockingProgress
クラスは、モック上のメソッドの呼び出しがスタブなのか既存のスタブ動作の再生なのかを判断するために、モックされたメソッドの戻り値でスタブに関する情報を渡すのではなく、モック上のメソッドの呼び出しがスタブなのか既存のスタブなのかを判断します。
mockitoのコードを見て、数分でできるミニ解析は以下の通りです。 これは非常に大雑把な説明で、ここには多くの詳細があります。 私は、あなたがチェックアウトすることをお勧めします。 ソースはgithubにあります。 をご覧ください。
まず、クラスをモック化する際に
mock
メソッドの
Mockito
クラスでは、基本的にこのようなことが起こります。
-
Mockito.mock
に委ねる。org.mockito.internal.MockitoCore
.mock のデフォルトのモック設定をパラメータとして渡します。 -
MockitoCore.mock
をデリゲートします。org.mockito.internal.util.MockUtil
.createMock -
は
MockUtil
クラスはClassPathLoader
クラスのインスタンスを取得します。MockMaker
を使用して、モックを作成します。 デフォルトでは CgLibMockMaker クラスが使用されます。 -
CgLibMockMaker
は、JMockから借用したクラスを使用しています。ClassImposterizer
は、モックの作成を処理するものです。 使用されている「モッキート・マジック」の主要な部分はMethodInterceptor
は、モックを作成するために使用されるモッキートMethodInterceptorFilter
のインスタンスを含む MockHandler インスタンスの連鎖を作成します。 MockHandlerImpl . メソッドインターセプターは MockHandlerImpl インスタンスに呼び出しを渡し、モック上でメソッドが呼び出されたときに適用されるべきビジネスロジックを実装します (すなわち、回答がすでに記録されているかどうかを検索する、呼び出しが新しいスタブを表しているかどうかを判断するなど)。 デフォルトでは、呼び出されたメソッドに対応するスタブがまだ登録されていない場合は、 型にあわせた 空 の値が返される。
では、例のコードを見てみましょう。
when(mock.method()).thenReturn(someValue)
以下は、このコードが実行される順番です。
-
mock.method()
-
when(<result of step 1>)
-
<result of step 2>.thenReturn
何が起こっているかを理解する鍵は、モック上のメソッドが呼び出されたときに何が起こるかです。メソッドインターセプターは、メソッドの呼び出しに関する情報を渡され、そのチェーンにデリゲートされるのです。
MockHandler
インスタンスに委譲され、最終的に
MockHandlerImpl#handle
. この間
MockHandlerImpl#handle
のインスタンスを作成します。
OngoingStubbingImpl
に渡し、それを共有の
MockingProgress
インスタンスを作成します。
このとき
when
メソッドが起動された後に
method()
に委譲されます。
MockitoCore.when
を呼び出します。
stub()
メソッドと同じです。 このメソッドは、進行中のスタブを共有の
MockingProgress
インスタンスで、モックされた
method()
に書き込んで、それを返します。 次に
thenReturn
メソッドが呼び出されます。
OngoingStubbing
のインスタンスを作成します。
関連
-
[解決済み] Mockito - メソッドのスタブ時にNullpointerExceptionが発生する。
-
[解決済み] Moqでクラスをモックするとき、特定のメソッドだけをCallBaseする方法は?
-
[解決済み] プライベートメソッド、フィールド、インナークラスを持つクラスをテストするにはどうすればよいですか?
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み] Mockitoを使用して特定のメソッドが呼び出されていないことを確認するにはどうすればよいですか?
-
[解決済み] Mockitoは複数回呼び出されたメソッドの引数をキャプチャできますか?
-
[解決済み] Mockitoで静的メソッドをモックする
-
[解決済み】Mockitoのモックオブジェクトが次に呼び出されたときに異なるものを返すように指示するには?
-
[解決済み】入力引数に基づくpython関数のモッキング
-
[解決済み] Mockitoのマッチャーはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] mockitoのwhen()呼び出しはどのように動作するのですか?
-
[解決済み】ユニットテストを実行せずにMavenプロジェクトをビルドする
-
[解決済み】Unit Testsの一般的な命名規則にはどのようなものがありますか?[クローズド]。
-
[解決済み] JUnitを使ったユニットテストのためのIntelliJ IDEAの設定
-
[解決済み] クロームの拡張機能をテストするには?
-
[解決済み] Unit Testsでランダムデータ?
-
[解決済み] ユニットテストはゲッターとセッターのために書くべきですか?
-
[解決済み] GTestとCMakeを使った作業の始め方
-
[解決済み] "エラー。Karma-Jasmineのユニットテストケースを書いているときに「No provider for router」というエラーが発生しました。
-
[解決済み] Junit: 統合テストと単体テストの分割