top 12 mockito interview questions
Mockitoモックインタビューをクラックするために最も頻繁に尋ねられるMockitoインタビューの質問:
前のチュートリアルでは、 モックのプライベート、静的、および無効な方法 。 を読んでください Mockitoの完全なトレーニングチュートリアル Mockitoフレームワークを明確に理解するため。
この記事では、MockitoMockingフレームワークで最もよく聞かれる典型的なインタビューの質問について説明します。
すべての開発者またはQAは、最もホワイトボックステスト(または単体テスト)を簡単に記述し、依存関係をモックしてコードカバレッジを強化し、アプリケーションの信頼性を高めるために、モックの基本を知っている必要があります。
詳細な回答と最も人気のあるMockitoインタビューの質問
以下に、モックフレームワークに関して最もよく寄せられる質問を示します。
Q#1)なぜモックが必要なのですか?
回答: 分離されたコードの単体テストを支援し、テストの再現性と予測可能性を高めるモックのユースケースはたくさんあります。
モックは通常、次の場合に必要です。
に) テスト対象のコンポーネントに、まだ実装されていない依存関係があるか、実装が進行中です。
良い例は、ある時点で後で利用可能になるREST APIエンドポイントですが、依存関係を介してコードでそれを消費しました。
実際の実装はまだ利用できないため、ほとんどの場合、そのAPIの予想される応答は何かを知っています。モックを使用すると、これらの種類の統合をテストできます。
b) コンポーネントはシステムの状態を更新します。
例: DB呼び出し–テスト目的のみのデータでDBを更新することは望ましくありません。これにより、データが破損する可能性があります。さらに、テストの実行時にDBの可用性が別の課題になります。
したがって、このような動作を回避するために、テスト対象のコンポーネントでDB呼び出しをモックすることができます。したがって、DBとテスト対象のコンポーネントが直接結合することはありません。
Q#2)doReturnとthenReturnの違い。
回答: Mockitoは、次のようなスタブを作成するための2つの異なる構文を提供します。
- doReturnとthenReturn
- doNothing(thenNothingではない)
- doThrowそしてthenThrow
これらの方法は両方ともスタブをセットアップし、スタブを作成/セットアップするために使用でき、時には交換可能に使用できます。
jarファイルを開くために何を使用するか
では、これらの両方はどのように異なりますか?
に) スタブのthenReturn方法は、スタブを設定するタイプセーフな方法です。これが本質的に意味するのは、スタブ化する戻り値の型に対してもコンパイル時のチェックを行うということです。
例を挙げてこれを理解しましょう。
メソッドを想定する getItemDetails オン mockedItemService タイプのオブジェクトを返します ItemSku。 だからと thenReturn、 ItemSku型以外のものを返すことはできませんが、doReturnを使用すると、何かを返すようにスタブを設定でき、実行中にテストが失敗(または例外をスロー)します。
//動作します
when (mockedItemService.getItemDetails(123)).thenReturn(new ItemSku());
//コンパイル時例外をスローします
when (mockedItemService.getItemDetails(123)).thenReturn(expectedPrice);
// doReturnを使用すると、コンパイルが安全ではないため、両方のスタブセットアップが機能します。
//ここでは、double型のオブジェクトを返そうとしていますが、それでも機能し、コンパイル時の警告はスローされません。
doReturn (expectedPrice).when(mockedItemService.getItemDetails(123)); doReturn (new ItemSku()).when(mockedItemService.getItemDetails(123));
b) スタブへのこれら2つの方法のもう1つの重要な違いは、モックオブジェクトの場合です。コンパイルの安全性を除けば、大きな違いはありません。
ただし、Spiedオブジェクトの場合、「thenReturn」の種類のスタブセットアップは機能しません。これは、スタブ応答が呼び出しとして返される前に、モックではなく、実際のオブジェクトインスタンスをラップしているスパイで実際のメソッドを呼び出す結果になるためです。 。
だから、という名前のスパイがいるとしましょう spiedObjectには、整数を返すメソッドtestMethodがあり、これにスタブを設定するには、thenReturnの代わりにdoReturnを使用する必要があります。
doReturn (10).when(spiedObject.testMethod());
Q#3)いつ、なぜスパイを使用する必要がありますか?
回答: スパイは、Mockitoでサポートされている部分的なモックの一種です。
これは本質的に、次のようなインスタンスのタイプであることを意味します。
に) モックが設定されていない場合、スパイでの相互作用により、実際のメソッドが呼び出されます。ただし、実際に呼び出されたメソッド、メソッドが呼び出された回数、メソッドが呼び出された引数は何かなど、スパイされたオブジェクトとの相互作用を確認することはできます。
b) 部分的なモックを設定する柔軟性が得られます。
例えば、 2つのメソッド(method1とmethod2)を持つオブジェクトがあり、method1を呼び出し、method2をモックする場合。スパイはこの種の設定を提供します。
したがって、モックとスタブの簡単な違いは次のとおりです。モックはインスタンスからではなく型から作成されますが、スタブはクラスオブジェクトの実際のインスタンスをラップします。
Q#4)Mockitoを使用して静的メソッドをモックできないのはなぜですか?
関数c ++への未定義の参照
回答: 静的メソッドはクラス自体に関連付けられており、クラスの特定のインスタンスには関連付けられていません。これは、クラスのすべてのインスタンス/オブジェクトが静的メソッドの同じインスタンスを使用することを意味します。
静的メソッドは手続き型コードに似ており、一般的にレガシーシステムで主に使用されます。
モックライブラリは通常、実行時にインターフェイスまたは継承を介して動的インスタンスを作成することでモックを作成します。静的メソッドは特定のインスタンスに関連付けられていないため、モックフレームワーク(mockito、easy mockなど)で静的メソッドをモックすることはできません。
静的メソッドをサポートしているPowerMockのようなフレームワークは、静的メソッドをモックするために実行時にバイトコード操作を実行します。
Q#5)モックが呼び出されたことを確認する必要は何ですか?
回答: モックオブジェクト(またはスパイされたインスタンス)にスタブを設定しても、スタブ設定が呼び出されたかどうかは保証されません。
「検証」マッチャーは、セットアップされたスタブが実際に呼び出されたかどうか、呼び出しが行われた回数、スタブメソッドが呼び出された引数などを検証する機能を提供します。
本質的に、これにより、テストのセットアップと期待される結果をより堅牢な方法で検証できます。
Q#6)テスト可能な優れたコードとは何ですか?
回答:
テスト可能なコード(簡単に単体テストできることを意味します)に関するいくつかのポイントは次のとおりです。
- 依存関係や密結合の数を減らしました– 例: 依存関係は、直接インスタンス化するのではなく、注入する必要があります。
- SRP(単一責任原則)に準拠するコード –これは基本的に、クラスに変更する理由が複数あるべきではないことを意味します。 SRPを順守することで、クラスがそれ自体に依存することを回避し、コードをまとまりのあるクリーンな状態に保ちます。
- 静的メソッドと最終クラスの使用量を減らす/最小限にする– これらは一般的にコードの臭いを示し、ほとんどがレガシーコードに関連していました。
Q#7)Mockitoの制限は何ですか?
回答: Mockitoは、ほとんどのJavaベースのプロジェクトに最適なフレームワークです。実装、読み取り、理解は簡単です。
機能に関する欠点または制限のいくつかは次のとおりです。
- 静的メソッドをモックすることができない。
- コンストラクター、プライベートメソッド、および最終クラスをモックすることはできません。
Q#8)プライベートメソッドとスタティックメソッドのモックをサポートできるフレームワークはどれですか?
回答: PowerMockito(Mockitoフレームワークの拡張)、JMockitなどのフレームワークは、プライベートメソッドと静的メソッドをモックする手段を提供します。
Q#9)Java8のInterfaceのデフォルトメソッドのモック/スタブ。
回答: Java 8のインターフェイスでのデフォルトメソッドの実装により、Mockitoはそのようなデフォルトメソッドをモックするためのすぐに使えるサポートを提供します。 (このサポートはMockito 2以降で導入されたことに注意してください)。
これらのメソッドは、クラスまたはインターフェイスの他のメソッドと同じようにモック/スタブすることができます。
Q#10)Mockitoでスタブ呼び出しの順序を確認するにはどうすればよいですか?
回答: モックが呼び出された順序を確認する場合は、Mockitoの「 順番に 」インターフェースを使用できます。
テスト中に、Inorderオブジェクトをセットアップ/作成するだけで、モックの順序を確認する必要があるモックオブジェクトのリストを一覧表示できます(同じモックに複数のメソッドがあり、必要なモックが他にない場合)検証するには、モッククラスについて一度だけ言及するだけで十分です)。
InOrderのオブジェクトを定義し、mockDatabaseImplの2つのオカレンスに言及する以下のテストについて考えてみます。
@Test public void calculateSumAndStore_withValidInput_verifyMockOrder() { // Arrange studentScores = new StudentScoreUpdates(mockDatabaseImpl); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabaseImpl).updateScores(anyString(), anyInt()); Mockito.doReturn('A').when(mockDatabaseImpl).getGrade(anyInt()); InOrder inorder = inOrder(mockDatabaseImpl); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert inorder.verify(mockDatabaseImpl).updateScores(anyString(),anyInt()); inorder.verify(mockDatabaseImpl).getGrade(anyInt()); }
また、参考までに、テスト対象のメソッドのコードをリストアップすると、テストの実行順序を理解するのに役立ちます。
public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); databaseImpl.getGrade(total); }
上記のように、databaseImplは最初にupdateScoresを呼び出し、次にgetGradeを呼び出します。
したがって、Mockitoを使用して単体テストを作成していて、これについて、databaseImplでの呼び出しの順序を確認する必要がある場合は、テストコードを参照して、期待どおりの順序でアサートが行われるようにします。
上記の例では、アサーションの順序を変更すると、「VerificationInOrderFailure」を除いてテストが失敗します。
アサート順序を変更すると、コードは次のようになります。
@Test public void calculateSumAndStore_withValidInput_verifyMockOrder() { // Arrange studentScores = new StudentScoreUpdates(mockDatabaseImpl); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabaseImpl).updateScores(anyString(), anyInt()); Mockito.doReturn('A').when(mockDatabaseImpl).getGrade(anyInt()); InOrder inorder = inOrder(mockDatabaseImpl); // Act studentScores.calculateSumAndStore('Student1', scores); // Assert inorder.verify(mockDatabaseImpl).updateScores(anyString(),anyInt()); inorder.verify(mockDatabaseImpl).getGrade(anyInt()); }
上記のテスト実行では、次のタイプの例外がスローされます。
セレンウェブドライバーのラジオボタンを選択する方法
「verificationInOrderFailure」org.mockito.exceptions.verification.VerificationInOrderFailure:
注文失敗の検証
必要だが呼び出されていない:
mockDatabaseImpl.updateScores(
isA(java.lang.String)、
isA(java.lang.Integer)
Q#11)連続するメソッド呼び出しに対して複数の値を返す
回答: 同じスタブメソッドの複数の呼び出しに対して異なる値を返すために、Mockitoは以下に示す3つのアプローチを提供します。
に) カンマ区切りの使用: これはthenReturnで機能します。
例えば 、上記のコードサンプルを使用して、メソッドの連続スタブを設定してみましょう– getGradeは、反復のシーケンスに応じて異なる値を返します。
when (mockDatabaseImpl.getGrade( anyInt ())).thenReturn('A','B', 'C');
つまり、テスト対象のメソッドでgetGradeメソッドが呼び出されると、最初の呼び出しは「A」を返し、2番目の呼び出しは「B」を返します。
b) 連続してthenReturn: これは、thenReturnステートメントと連鎖するアプローチです。同じ例に連鎖呼び出しを適用すると、次のようになります。
when (mockDatabaseImpl.getGrade( anyInt ())).thenReturn('A').thenReturn('B').thenReturn('C');
c)連続したdoReturn: 最後のアプローチは、上記のようにチェーン形式でdoReturnを使用することです。
doReturn ('A').doReturn('B').doReturn('C').when(mockDatabaseImpl).getGrade( anyInt ())
Q#12)モックフレームワークの種類とその仕組みは何ですか?
回答: モックフレームワークの種類とその仕組みを以下に説明します。
モックフレームワークには大きく2つのカテゴリがあります。
- プロキシベース - 例、 Mockito、EasyMockなど。
- バイトコードベース - 例、 PowerMock、JMockitなど。
異なるパラメータでこれら両方のフレームワークを比較してみましょう。
プロキシベース | バイトコードベース | |
---|---|---|
簡単に | よりシンプルで使いやすい | 複雑なモックセットアップロジックが含まれる場合があります |
作成モード | クラス/インターフェースのインスタンスを実際に必要としないプロキシまたは偽のオブジェクトが作成されます | これは基本的にオブジェクトの作成を含み、実行時にモック/スタブ動作のためにインスタンスを操作します |
機能性 | クラスとインターフェースのモック | クラスとインターフェイスに加えて、静的メソッド、最終クラスなどをモックすることができます |
Javaの依存関係 | Javaバージョンとあまり緊密に結合されていません | これらのフレームワークはバイトコード操作を伴うため、緊密に結合されており、Javaバージョン間で下位/上位互換性がない可能性があります。 |
例 | Mockito、EasyMockなど。 | PowerMock、JMockitなど。 |
結論
この記事で取り上げる内容は、モックフレームワーク、特にモックイトインタビューの準備に関する基本的な議論に役立ちます。
カバーされている質問の理論的理解を得ることに加えて、これらのフレームワークの学習をより楽しく興味深いものにする実際のコード例を試してみる必要があります。
このMockitoシリーズのチュートリアルの全範囲を楽しんだことを願っています。
ハッピーラーニング。