ウィキペディアがこれについて言っていること :「オブジェクト指向プログラミングでは、モックオブジェクトは与えられた方法で実際のオブジェクトの動作を模倣します...」。 どうしてだろう? ウィキペディアは続けます:「ユニットテスト中に、モックオブジェクトはビジネスオブジェクトとビジネスロジックの動作をシミュレートできます。これは、実際の動作が複雑なために必要になることがあります」
そして、モックライブラリはJava開発者に何を与えますか? もちろん、同じモックオブジェクトを作成して使用することの便利さ!
java-source.net は 、最大7つのライブラリをリストします。
私は、java-source.netにない別のライブラリ(Mockito)のモックオブジェクトと知り合いになりました 。 私はjavaposseの意見を信頼しました。彼はmockitoを今週のライブラリとして認識し、javaブロゴスフィアのムードも失望しませんでした。 また、それがいかに便利であるかも評価します。
注意! 一口飲んだ-止めることは不可能です。
動作を確認する
モックオブジェクトはメソッドの呼び出しを記憶するため、テストコードがモックオブジェクトを呼び出したメソッドを確認できます
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
Copy Source | Copy HTML // ( ) import static org.mockito.Mockito.*; // - mock- (: List. class - ) List mockedList = mock(List. class ); // mockedList. add ("one"); mockedList.clear(); //, add "one" clear verify(mockedList). add ("one"); verify(mockedList).clear();
しかし、スタブはどうですか?
デフォルトでは、モックオブジェクトのすべてのメソッドはデフォルト値、ブール値の場合はfalse、intの場合は0、空のコレクション、他のオブジェクトの場合はnullを返します。
Copy Source | Copy HTML
- //インターフェースだけでなく、特定のクラスのモックを作成できます
- LinkedList mockedList = mock(LinkedList。Class);
- //スタブ化
- when (mockedList。get(0))。thenReturn( " first ");
- when (mockedList。get(1))。thenThrow( new RuntimeException());
- //「 最初 」を取得
- システム out .println(mockedList。get(0));
- // RuntimeExceptionを取得します
- システム out .println(mockedList。get(1));
- // get(999)が定義されていなかったため、「 null 」を取得します
- システム out .println(mockedList。get(999));
呼び出しの正確な数を確認する
Copy Source | Copy HTML
- //モックオブジェクトを使用します
- mockedList。 追加 (「1回」);
- mockedList。 追加 (「2回」);
- mockedList。 追加 (「2回」);
- mockedList。 追加 (「3回」);
- mockedList。 追加 (「3回」);
- mockedList。 追加 (「3回」);
- // 1回〜1回呼び出されたデフォルトのチェック(1)
- 検証(mockedList)。 追加 (「1回」);
- 検証(mockedList、回(1))。 追加 (「1回」);
- //呼び出しの正確な数
- 検証(mockedList、回(2))。 追加 (「2回」);
- 確認(mockedList、回(3))。 追加 (「3回」);
- // never〜never()〜times(0)
- 検証(mockedList、決して())。 追加 (「発生しなかった」);
- //少なくとも、せいぜい
- 検証(mockedList、atLeastOnce())。 追加 (「3回」);
- 検証(mockedList、atLeast(2))。 追加 (「5回」);
- 検証(mockedList、atMost(5))。 追加 (「3回」);
実際のオブジェクトに寄生する
メソッドを呼び出すときに実際のオブジェクトを使用するモックオブジェクト(より正確には、スパイオブジェクト)を作成できます。 必要なメソッドのみをオーバーロードします。つまり、部分的なモックオブジェクトです。
Copy Source | Copy HTML
- リストリスト= new LinkedList();
- リストspy = spy(リスト);
- //オプション、 size ()メソッドのみを定義
- when (スパイサイズ ())。thenReturn(100);
- //実際のメソッドを使用します
- スパイ。 追加 (「1」);
- スパイ。 追加 (「2」);
- //「1」を取得
- システム out .println(spy。get(0));
- // size ()メソッドは私たちによって再定義されます-100を取得します
- システム out .println(spy。size());
- //チェックできます
- 確認(スパイ)。 追加 (「1」);
- 確認(スパイ)。 追加 (「2」);
同様に
- 再定義されたメソッドの引数にマスクを使用します
- voidを返すメソッドをオーバーライドする
- モックオブジェクトの呼び出し順序を確認する
- 不要なモックオブジェクトの呼び出しを探す
- 抽象モック
- 同じ引数に対する異なる戻り値
- ... 残り物は甘い
さらに読む:
ありがとう そして、はい、モックという言葉はこの投稿で58回言及されています。