Junitライブラリ「Mockito」のverifyの使い方

mockito

「Mockito」のverifyの使い方を紹介します。
verifyは、@Mockや@Spyとセットで使います。
verifyは、モック化したメソッドが「何回呼ばれたか?」、「引数は値は正しいか?」といった内容をチェックする機能です。
モック化したメソッドを経由すると、多少なりとも不安はつきものです。

[スポンサーリンク]

verifyを使うことで、単体レベルのテストは精度が確実にあがります。
junitでモックを使うと、「結合レベルで正常に動いていくれるのだろうか...」という不安にかられます。
単体レベルのテストは精度をあげることで、これらの不安も多少は緩和されるはずです。

この章でやること

verifyの基本的な使い方を紹介します。

テスト対象のクラス

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

public class SampleA {

    private SampleB sampleB;

    public String createName() {

    	int id = 1;
    	String ret = sampleB.getName(id);

	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;
    }
}

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

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

    @Mock(name="sampleB")
    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();
    	
    	// 呼び出し回数を確認する。
    	// sampleBMock.getName() メソッドの引数が、1で、
    	// sampleBMock.getName() メソッドの呼び出し回数が、1回
    	// の場合はエラーにならずにここを通過する。
    	verify(sampleBMock, times(1)).getName(1);
    	
    	// 戻り値を確認する。
    	assertEquals("mock", ret);
    }
}

解説

29行目で、verifyが登場します。
この行では、sampleBMock.getName()メソッドの呼び出し方をテストしています。

SampleAからの、sampleBMock.getName()の呼び出し回数と、sampleBMock.getName()の引数の値をテストしています。
呼び出し回数が1回で、引数が1の場合は、junitが正常終了します。
もしも、呼び出し回数と引数が指定した数と異なっていたら、junitがエラーとなります。

最後に

verifyは確実にjunitの精度を上げてくれます。
もしモックを使っていて、verifyを使っていないjunitがあれば、単体レベルのテストとして少し疑ってしまいます。

@Mockとverifyはセットで使うクセをつけましょう!
それでは!