Junitライブラリ「Mockito」の@Mockと@InjectMocksの使い方

mockito

javaのjunitですが、何かしらのJunitライブラリを使わないと、非常に難しいように感じます。
今回はMockitoの使い方を紹介していきます!

[スポンサーリンク]

例えば、クラスAは、クラスBとCとDを呼んでいて、、、、といったクラスがあるとします。
クラスAのテストをするために、クラスB以降を無理やり動かしてテストするというのは非常に手間がかかります。

そこでだいたいのプロジェクトでは、Junitライブラリを使って、テストとは関係のないクラスをモック化します。
このJunitライブラリは色々な種類がありますが、わたしはMockitoをおススメします。

この章でやること

「Mockito」の@Mock@InjectMocksの使い方を解説します。

テスト対象のクラス

SampleA をテスト対象のクラスにします。
このクラスは、SampleB を使っています

public class SampleA {

    private SampleB sampleB;

    public String createName() {
    	String ret = sampleB.getName(1);
    	return ret;
	}
}

こちらが、SampleB のクラスです。

public class SampleB {

	public  String getName(Integer id) {
    	String name = null;
    	if (id == 1) {
    		name = "test1";
    	} else if (id == 2) {
    		name = "test2";
    	} else {
    		name = "other";
    	}
    	return name;
    }
}

Mockitoを使って、SampleAのテストをします。

import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
public class MockitoSampleTest {

	@Mock
	private SampleB sampleBMock;

	@InjectMocks
	private SampleA sampleA = new SampleA();

    @Before
    public void setup() {
    	MockitoAnnotations.initMocks(this);
    }
    
    @Test
    public void testVerify() {
    	
    	// モックを用意する。
    	when(sampleBMock.getName((Integer)anyObject())).thenReturn("mock");

    	// テスト対象のクラスを実行します。
    	String ret = sampleA.createName();
    	
    	// 戻り値を確認する。
    	assertEquals("mock", ret);
    }
}

解説

6行目で、SampleBクラスのモックを作成しています。
9行目で、インジェクト先(テスト対象のクラス)のクラスを指定しています。

インジェクトは、13行目の「MockitoAnnotations.initMocks」を使っています。
この記述は忘れないように注意して下さい
忘れてしまうと、インジェクトが出来なくて、テストが通らなくなります。

20行目で、モックの設定をしています。
sampleBMock.getName()メソッドが呼ばれたら、文字列「mock」を返却するように設定しています。

「(Integer)anyObject()」は、引数の方を指定しています。
ここでは、何かしらのIntegerクラスが指定されたら、文字列「mock」が返却されます。

最後に

今回は、非常に簡単な(基礎的な)junitを作りました。
簡単すぎてMockitoじゃなくてもいいんじゃないの?と思われるようなロジックです。。

Mockitoの強みは、verifyspyにあります。
こちら今回は紹介していませんが、次回以降で紹介していきます。
verifyやspyの使い方を理解すると、Mockitoが手放せなくなると思います。(特にspy!)

Mockitoの読み方ですが、本家のイラストを見るとカクテルの「モヒート」をもじっているようにもみえます。
正式な読み方は、「モキート」なのでしょうか?
わたしはいつも、「モキット」と読んでいます。

それでは!