Mockito便利です。
jMockの変態構文に慣れない方は、EasyMockを使ってらっしゃると思います。
EasyMockのスタイルは素敵ですね。
ただ、人に勧めるときに、replayとかverifyとか、定義以外に文をはさむのってなんかいやですよね。
お勧めしづらいですね。
expectLastCallなんかもみっともない。
そこで
Mockito-
- @SuppressWarnings("unchecked")
- List<string> mockedList = mock(List.class);
-
-
- when(mockedList.add("one")).thenReturn(true);
-
- doNothing().when(mockedList).clear();
-
-
- assertEquals(true, mockedList.add("one"));
- mockedList.clear();
- </string>
// モック作成
@SuppressWarnings("unchecked")
List mockedList = mock(List.class);
// あらかじめ、何が起こるかを書く
when(mockedList.add("one")).thenReturn(true);
// voidはwhenの引数として受け取れないのでdo*で書き直す。
doNothing().when(mockedList).clear();
// モックに対して実行
assertEquals(true, mockedList.add("one"));
mockedList.clear();
事前に定義する方法のほかに、あとからVerifyする方法もあります。
-
- @SuppressWarnings("unchecked")
- List<string> mockedList = mock(List.class);
-
-
- mockedList.add("one");
- mockedList.clear();
-
-
- verify(mockedList).add("one");
- verify(mockedList).clear();
- ring>
// モック作成
@SuppressWarnings("unchecked")
List mockedList = mock(List.class);
// モックに対して実行
mockedList.add("one");
mockedList.clear();
// 検証
verify(mockedList).add("one");
verify(mockedList).clear();
呼び出し回数も限定しておきます。
- @SuppressWarnings("unchecked")
- LinkedList<string> mockedList = mock(LinkedList.class);
-
- mockedList.add("once");
-
- mockedList.add("twice");
- mockedList.add("twice");
-
- mockedList.add("three times");
- mockedList.add("three times");
- mockedList.add("three times");
-
-
- verify(mockedList).add("once");
- verify(mockedList, times(1)).add("once");
- verify(mockedList, times(2)).add("twice");
- verify(mockedList, times(3)).add("three times");
-
-
- verify(mockedList, never()).add("never happened");
-
-
- verify(mockedList, atLeastOnce()).add("three times");
- </string>
@SuppressWarnings("unchecked")
LinkedList mockedList = mock(LinkedList.class);
// モックに対してメソッド呼び出し
mockedList.add("once");
mockedList.add("twice");
mockedList.add("twice");
mockedList.add("three times");
mockedList.add("three times");
mockedList.add("three times");
// 回数指定で検証開始
verify(mockedList).add("once");
verify(mockedList, times(1)).add("once");
verify(mockedList, times(2)).add("twice");
verify(mockedList, times(3)).add("three times");
// 呼ばれてない確認。times(0)でもOK
verify(mockedList, never()).add("never happened");
// 細かい数は不要。一度でも呼ばれたらOK
verify(mockedList, atLeastOnce()).add("three times");
すでに存在するオブジェクトに対して、部分的にモックを割り当てます。
名づけて"spy"
-
- LinkedList<string> spyList = spy(new LinkedList<string>());
- when(spyList.size()).thenReturn(100);
-
-
- spyList.add("one");
- assertEquals("one", spyList.get(0));
-
-
- assertEquals(100, spyList.size());
-
- verify(spyList).add("one");
- ring></string>
// 部分的に書き換える。
LinkedList spyList = spy(new LinkedList());
when(spyList.size()).thenReturn(100);
// addやgetは本来の動き
spyList.add("one");
assertEquals("one", spyList.get(0));
// sizeは置き換えました。
assertEquals(100, spyList.size());
verify(spyList).add("one");
Mock作成が楽しくなりました。
Javaの構文による呼び出し順序を利用したマジックですが、
ここまできれいな構文で書けるなら、受け入れるしかないでしょう。
Mock内で引数に加工したり、詳しく検証する場合は、Anythingというインターフェースを使って実装するのですが、そこはまだありがちな構文。
PowerMockもMockitoに対応中。
まあ、PowerMockなんて、一時的に使うことはあっても、すぐ書き直してMockitoだけで通るように変更するのでいらないけど。