- public class MyClassA {
- MyClassB mMyClassB;
- public MyClassA(MyClassB b) {
- mMyClassB = b;
- }
- public void hoge() {
- if (mMyClassB.getPriority() > 0) {
- handleHighPriority();
- }
- else {
- handleLowPriority();
- }
- }
- public void handleHighPriority() {
- ...
- }
- public void handleLowPriority() {
- ...
- }
- }
- public class MyClassB {
- private int mPriority;
- public int getPriority() {
- return mPriority;
- }
- // 内部の処理で mPriority の値が決まる
- ...
- }
失敗するテスト
- public void testWhenHighPriority() {
- MyClassA mockMyClassA = mock(MyClassA.class);
- mockMyClassA.hoge();
- verify(mockMyClassA, times(1)).handleHighPriority();
- verify(mockMyClassA, never()).handleLowPriority();
- }
mock() で作成した mockMyClassA では mClassB が null になっているからです。
そこで MyClassB をモックにし、それを MyClassA のコンストラクタに与えるようにします。
失敗するテスト
- public void testWhenHighPriority() {
- MyClassB mockMyClassB = mock(MyClassB.class);
- MyClassA myClassA = new MyClassA(mockMyClassB);
- myClassA.hoge();
- verify(myClassA, times(1)).handleHighPriority();
- verify(myClassA, never()).handleLowPriority();
- }
失敗するテスト
- public void testWhenHighPriority() {
- MyClassB mockMyClassB = mock(MyClassB.class);
- MyClassA mockMyClassA = spy(new MyClassA(mockMyClassB));
- mockMyClassA.hoge();
- verify(mockMyClassA, times(1)).handleHighPriority();
- verify(mockMyClassA, never()).handleLowPriority();
- }
そこで mockito の機能を使います。
mockito では、「モックのあるメソッドが呼ばれたときにこの値を返す」という指定ができます。
"あるメソッドが呼ばれた" ということを指定するのが Mockito.when() メソッドです。
"そのときにこの値を返す" ということを指定するのが thenReturn() メソッドです。
MyClassB の getPriority() が呼ばれたときに 100 を返して欲しいなら
- when(mockMyClassB.getPriority()).thenReturn(100);
- /**
- * MyClassA.hoge() を呼んだとき、MyClassB の priority が 100 なら
- * MyClassA.handleHighPriority() が呼ばれることを確認する
- */
- public void testWhenHighPriority() {
- MyClassB mockMyClassB = mock(MyClassB.class);
- when(mockMyClassB.getPriority()).thenReturn(100);
- MyClassA myClassA = new MyClassA(mockMyClassB);
- myClassA.hoge();
- verify(mockMyClassA, times(1)).handleHighPriority();
- verify(mockMyClassA, never()).handleLowPriority();
- }
- /**
- * MyClassA.hoge() を呼んだとき、MyClassB の priority が 0 なら
- * MyClassA.handleLowPriority() が呼ばれることを確認する
- */
- public void testWhenLowPriority() {
- MyClassB mockMyClassB = mock(MyClassB.class);
- when(mockMyClassB.getPriority()).thenReturn(0);
- MyClassA myClassA = new MyClassA(mockMyClassB);
- myClassA.hoge();
- verify(mockMyClassA, times(1)).handleLowPriority();
- verify(mockMyClassA, never()).handleHighPriority();
- }
thenReturn(10, 20, 30, 100) のように指定すると、対応するメソッドが呼ばれるごとに返される値が後の引数になり、引数よりも呼ばれる回数が多くなったら一番最後の引数の値が返されます。
初めまして。
返信削除モックライブラリ、凄く便利ですよね。