最近android(java)のテストを書きたいと思って、モックライブラリのmockitoを勉強したのでメモ
と言っても以下の記事をざっくりまとめただけw
https://www.vogella.com/tutorials/Mockito/article.html#using-gradle-for-an-android-project
セットアップ
// build.gradeに以下を記述。
dependencies {
// ... more entries
testCompile 'junit:junit:4.12'
// required if you want to use Mockito for unit tests
testCompile 'org.mockito:mockito-core:2.7.22'
// required if you want to use Mockito for Android tests
androidTestCompile 'org.mockito:mockito-android:2.7.22'
}
上に青字でsyncボタンが出てくるのでタップすると、セットアップ完了。
MainActivity.javaを開き、クラスをクリックして、goto testを選択。
Android testか、unit testのフォルダを選択する必要があるので、
Unit testのフォルダを選択。
// 以下が自動生成された。
package com.example.mockitosandbox;
import static org.junit.Assert.*;
public class MainActivityTest {
}
まず、テスト対象のクラスをMainActivityと同じフォルダに作る。
public class Foo {
public String foo() {
return "foo";
}
}
上記コードのFooを右クリックし、unit testをjunit4で作成する。
Footestを以下のように書き換える。
一般的なjunit4のテストだ。
import static org.mockito.Mockito.*;
public class FooTest {
@Test
public void testClassTest() {
// モックを作成
Foo foo = mock(Foo.class);
// 返り値をモックする。
when(foo.foo()).thenReturn("kaba");
// testを作成。
assertEquals(foo.foo(), "kaba");
}
テストが成功したら、モック成功だ!
static importとは?
org.mockito.Mockito.*;をstaticにimportすることで、meck()のような、メソッドを、直接テストに使うことが出来る。static importは、staticメンバを使うことを可能にする。例えば、クラス内メソッドや、フィールドをクラスを指定せずに記述できる。
stitic importは、可読性を大きく向上させるので、おすすめです。
Mockの返り値を設定する。
一般的なモックライブラリのように、モックに任意の還り値を与えることが出来る。
以下のコードでは、モックオブジェクトに帰り値を設定している。
package com.example.mockitosandbox;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import java.util.Iterator;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
public class MainActivityTest {
@Test
public void testMoreThanOneReturnValue() {
Iterator<String> i= mock(Iterator.class);
when(i.next()).thenReturn("Mockito").thenReturn("rocks");
String result= i.next()+" "+i.next();
//assert
assertEquals("Mockito rocks", result);
}
}
一番やりたいクラス内で宣言される、androidモジュールのモックのやり方が書いていない。
見つかり次第記述する。
これぐらいできたら、基本的なモックは作れそう。
個人的メモ完