PowerMockitoを使ってみるテスト
- 2015年05月04日
- CATEGORY- 1. 技術力{技術情報}
こんにちは!
さて今回は趣向を変えてJ-Unitの話題にしてみます。
PowerMockitoの使い方を少し紹介したいと思います。
外部にHttpリクエストを投げるコードはよくあるかと思います。
単体テストする際にその部分は外部ソース扱いとして切り離して考えるのがベターです。ですが、レスポンス毎のエラー処理などはちゃんとテストしたいですね。
じゃあMock化してしまいましょう。
簡単なHttpRequestを投げるclassです。
テストクラスを作成する際には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の便利な使い方⑥
- 2015年05月04日
- CATEGORY- 1. 技術力{技術情報}