mockito雑多なサンプル
mockitoについての全投稿は/tag/mockitoにあるので参照されたい
その他のサンプル1
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import org.junit.*;
public class TestOne {
/** ログインを処理するインターフェース */
public interface Login {
boolean login(String user, String password);
}
Login mock;
@Before
public void setup() {
mock = mock(Login.class);
}
@Test
public void testOne() {
// 何も設定しない場合はfalseやnullが返る。
assertFalse(mock.login("guest", "pass"));
}
@Test
public void testTwo() {
// "guest", "pass"というパラメータで呼び出されたときにtrueを返すように設定する。
when(mock.login("guest", "pass")).thenReturn(true);
// 実際に呼び出してtrueが返されることを確認
assertTrue(mock.login("guest", "pass"));
// このパラメータで一度だけ呼び出されたことを確認
verify(mock).login("guest", "pass");
// 上は、以下の省略形である。
verify(mock, times(1)).login("guest", "pass");
// 「少なくとも一度」という指定も可能
verify(mock, atLeast(1)).login("guest", "pass");
// 以下は失敗する
//verify(mock, times(2)).login("guest", "pass");
//verify(mock, atLeast(2)).login("guest", "pass");
}
@Test
public void testThree() {
// パスワードが空のときは例外にするように設定
when(mock.login("guest", "")).thenThrow(new RuntimeException());
// 呼び出し
try {
mock.login("guest", "");
fail();
} catch (RuntimeException ex) {
}
// このパラメータで呼び出されたことを確認
verify(mock).login("guest", "");
// 以下は失敗する
//verify(mock).login("guest", "guest");
}
@Test
public void testFour() {
// 複数の引数パターンを使うことが可能
when(mock.login("guest", "pass")).thenReturn(true);
when(mock.login("guest", "1234")).thenReturn(true);
assertTrue(mock.login("guest", "pass"));
assertTrue(mock.login("guest", "1234"));
// 以前と同じ引数パターンをオーバーライド
when(mock.login("guest", "pass")).thenReturn(false);
assertFalse(mock.login("guest", "pass"));
// 呼び出された回数
verify(mock, times(2)).login("guest", "pass");
verify(mock, times(1)).login("guest", "1234");
}
@Test
public void testFive() {
// 引数はなんでもいいというときには「anyなんとか」を使う。
// 以下はパスワードはなんでもいい場合で、anyObject()
// また、この場合はなぜか"guest"ではだめで、eq("guest")としなければならない。
when(mock.login(eq("guest"), (String)anyObject())).thenReturn(true);
// いずれの場合もOK
assertTrue(mock.login("guest", "pass"));
assertTrue(mock.login("guest", "1234"));
// いずれも成功する
verify(mock).login("guest", "pass");
verify(mock).login("guest", "1234");
verify(mock, times(2)).login(eq("guest"), (String)anyObject());
}
}
その他のサンプル2
package com.cm55.mockitoTest.one;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.*;
import org.mockito.*;
public class TestTwo {
public interface IntegerBox {
boolean add(int value);
void clear();
}
// MockitoAnnotaions.initMocks()を呼び出すと、
// @Mockアノテーションのついた宣言にモックが入れられる。
@Mock IntegerBox mock;
@Before
public void setup() {
// すべての@Mockにモックを代入
MockitoAnnotations.initMocks(this);
}
@Test
public void testOne() {
// 何も設定しない場合はfalseやnullや0が返る。
assertFalse(mock.add(5));
}
@Test
public void testTwo() {
// 一度目、二度目、三度目に引数(10)で呼び出すと
// それぞれ、true, false, 例外となる指定
when(mock.add(10))
.thenReturn(true)
.thenReturn(false)
.thenThrow(new RuntimeException());
assertTrue(mock.add(10)); // 1度目
assertFalse(mock.add(20)); // これは20での呼び出しで無関係
assertFalse(mock.add(10)); // 2度目
try {
mock.add(10); // 3度目
fail();
} catch (RuntimeException ex) {
}
verify(mock, times(3)).add(10);
verify(mock).add(20);
}
@Test
public void testThree() {
// 返り値の無いメソッド呼び出しで例外を発生させたい場合は、
// 以下の特別な指定が必要。
// 返り値が無いのでwhen(mock.clear()).thenThrow(...)とは書けない。
doThrow(new IllegalStateException()).when(mock).clear();
try {
mock.clear();
fail();
} catch (IllegalStateException ex) {}
}
}
その他のサンプル3
package com.cm55.mockitoTest.one;
import org.junit.*;
import static org.mockito.Mockito.*;
public class TestThree {
public interface IntegerBox {
boolean add(int value);
void clear();
}
/** 作成されたが、何のメソッドも呼ばれていないことを確認する */
@Test
public void testOne() {
IntegerBox one = mock(IntegerBox.class);
IntegerBox two = mock(IntegerBox.class);
two.add(1); // twoのメソッドを呼び出した
verifyZeroInteractions(one); // oneは何のメソッドも呼び出されていない。
// verifyZeroInteractions(two); // これは失敗する。twoのメソッドは呼び出されたから
}
/** verifyされていないinteraction(メソッド呼び出し)が存在しないことの確認 */
@Test
public void testTwo() {
IntegerBox one = mock(IntegerBox.class);
// 二種類のメソッド呼び出しを行い、それを確認する。
one.add(1);
one.add(2);
verify(one).add(1);
// verifyNoMoreInteractions(one); これは失敗するone.add(2)をverifyしていない。
// one.add(2)をverifyする。
verify(one).add(2);
verifyNoMoreInteractions(one); // verifyしていない呼び出しは存在しない。
}
}
ディスカッション
コメント一覧
まだ、コメントがありません