PowerMockito
昨日の Mockito の続きとして、今度は PowerMockito.
https://code.google.com/p/powermock/
PowerMock という名前が正しいのかな?
PowerMock + Mockito = PowerMockito ということでいっか。
このページがだいぶ役に立った。
How to use PowerMock and Mockito to test static and private methods
昨日の Mockito と同じ例を使う。
内部でしか呼んでいない getHttpClient() を private メソッドに変えたことが、昨日と違うところ。
例えば、TestTarget というクラスがあるとする。
getData() が内部で HttpClient を使って通信して、その結果を返すとする。
ここで HttpClient をモックにしたいので、getHttpClient() というメソッドを作り、その動作を置き換える。
@RunWith(PowerMockRunner.class) @PrepareForTest(TestTarget.class) public Class TestTarget { public TestTarget(String arg1, String arg2) { } public String getData() { HttpClient httpClient = getHttpClient(); HttpResponse response = httpClient.execute(... String result = ... return result; } private HttpClient getHttpClient() { return HttpClients.createDefault(); } }
0. Class に Annotation として @RunWith, @PrepareForTest をつける。
1. PowerMockito.spy にテスト対象のクラスを渡して、メソッドを差し替える準備をする。
TestTarget instance = PowerMockito.spy(new TestTarget("TEST_VALUE1","TEST_VALUE2"));
2. doReturn と when で何をしたら何を返すかを書く。
getHttpClient() を呼んだら、モックである httpClientMock を返すようにする。
ここも Mockito とは違うところで、when と thenReturn だとうまくいかない。
HttpClient httpClientMock = Mockito.mock(HttpClient.class); PowerMockito.doReturn(httpClientMock).when(instance, "getHttpClient");
3. 置き換え後のインスタンスでテストをする。
Assert.assertNotNull(instance.getData());
4. HttpClient の代わりに HttpClientMock が呼ばれる。
こんな感じで使う。
モックに差し替えるためだけに Getter を用意した。
それだけの変更で済んだので個人的にはよし。
当然このようなメソッドは private であるべきなので、PowerMockito を使った。
だけど、どうやらこのやり方はCoolじゃないらしいとTwitterでコメントくれた人がいた。
その人がどこかにまとめると言っていたので、もしそれを読む機会があったら書き足すつもり。