2014.04.11

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でコメントくれた人がいた。
その人がどこかにまとめると言っていたので、もしそれを読む機会があったら書き足すつもり。

 


2014.04.11, 22:48 / PC関係
PowerMockito はコメントを受け付けていません