KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

PowerMockitoを使ってみるテスト


こんにちは!

さて今回は趣向を変えてJ-Unitの話題にしてみます。
PowerMockitoの使い方を少し紹介したいと思います。
powermock

外部にHttpリクエストを投げるコードはよくあるかと思います。

単体テストする際にその部分は外部ソース扱いとして切り離して考えるのがベターです。ですが、レスポンス毎のエラー処理などはちゃんとテストしたいですね。

じゃあMock化してしまいましょう。

簡単なHttpRequestを投げるclassです。

IMG001

IMG002

テストクラスを作成する際にはhttpClient.executeをMock化して
レスポンスや例外を変えればいいと考えますよね。

普通に考えたら簡単そうに見えますが、DefualtHttpClientがMock化できません。
DefualtHttpClient.execute(HttpUriRequest req)メソッドはfinalなのでMockitoではmock化できないのです。

ではどうするか。
いくつか案があると思いますが、今回はPowerMockitoでMock化する方法でMock化してみます。

テストコードはこのような感じです。

@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.net.ssl.*")
@PrepareForTest({DefaultHttpClient.class, HttpSampleUtil.class})
public class HttpSampleTest {

/**
* testCallHttp2
* use mock.
* @throws Exception
*/
@Test
public void testCallHttp2() throws Exception {

// StatusLine mock
StatusLine mStatusLine = mock(StatusLine.class);
when(mStatusLine.getStatusCode()).thenReturn(404);

// HttpResponse mock
HttpResponse mHttpResponse = mock(HttpResponse.class);
when(mHttpResponse.getStatusLine()).thenReturn(mStatusLine);

// DefaultHttpClient mock
DefaultHttpClient mDefaultHttpClient = PowerMockito.mock(DefaultHttpClient.class);
when(mDefaultHttpClient.execute(any(HttpGet.class))).thenReturn(mHttpResponse);

// HttpSampleUtil mock
PowerMockito.mockStatic(HttpSampleUtil.class);
Mockito.when(HttpSampleUtil.createHttpClient()).thenReturn(mDefaultHttpClient);

HttpSample httpSample = new HttpSample();
boolean actual = httpSample.callHttp();
assertEquals(false, actual);
}
}

一通りResponceまわりをMock化しないといけないのが少し面倒ですね。

今回のPowerMockitoのアノテーションには下記が必要です。
@RunWith(PowerMockRunner.class)
→PowerMockitoを使用するための定義
@PowerMockIgnore(“javax.net.ssl.*”)
→SSL関連を無視する設定
@PrepareForTest({DefaultHttpClient.class, HttpSampleUtil.class})
→Mock対象のClassを定義します。Mockを使用する側のClassも記載が必要です。
この記述が無いとMockObjectを渡してもMock動作しません。

Mock化している箇所の説明です。

DefaultHttpClient mockHttpClient = PowerMockito.mock(DefaultHttpClient.class);

→PowerMockito.mockでMockインスタンスを生成しています。
PowerMockitoなのでfinalでも生成できます。

PowerMockito.mockStatic(HttpSampleUtil.class);
Mockito.when(HttpSampleUtil.createHttpClient()).thenReturn(mockHttpClient);

→テスト対象Classから呼ばれるUtilです。こちらでDefaultHttpClientを生成しているためMock化します。
StaticClassのためPowerMockitoを使用してMock化しています。

これでMockされてテストクラスが動きます。

ステータスコードは下記の箇所を変更すると変更できます。

when(mockStatusLine.getStatusCode()).thenReturn(404);

例外をThrowしたい場合は下記の箇所を変更すると任意の例外が返却できます

when(mockHttpClient.execute(any(HttpGet.class))).thenThrow(new ConnectTimeoutException());

こんな感じでいかがでしょうかヽ(´ー`)ノ

 

【関連記事】
SOAPUIの便利な使い方①
SOAPUIの便利な使い方②
SOAPUIの便利な使い方③
SOAPUIの便利な使い方④
SOAPUIの便利な使い方⑤
SOAPUIの便利な使い方⑥