Tbpgr Blog

Recruiting Operations tbpgr(てぃーびー) のブログ

Java | mockitoで単体テストをMockする

概要

mockitoで単体テストをMockする

詳細

mockitoで単体テストをMockします。
業務ではdjUnitしか使って居なかったのですが、djUnitのMock機能は
メソッドを文字列で指定するためリファクタリング対象外になる、という欠点があります。

メソッドリファクタリングなどはよく行う機会が多く、
特にユーティリティ系の用に大量に利用されるコードをモック指定た場合に
リファクタリングの工数がかなり膨らんでしまいます。

導入手順

・下記URLからjarをダウンロード
https://code.google.com/p/mockito/downloads/list
・対象プロジェクトのビルドバスにjarを追加

サンプルコードリファクタリング

Chickenクラス

package mockito;

public class Chicken {
  public String cry() {
    return "cock-a-doodle-doo";
  }

  public String cryThreeTimes() {
    return cry() + "," + cry() + "," + cry();
  }
}

ChickenTestクラス

package mockito;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.junit.Test;

public class ChickenTest {

  private static final String CHIKEN_CROW_JA = "コケコッコー";

  @Test
  public void testCryThreeTimes() {
    // クラスごとMockしたい場合はmockメソッドを利用する
    Chicken mock = mock(Chicken.class);
    when(mock.cry()).thenReturn(CHIKEN_CROW_JA);
    String cry = mock.cry();
    assertThat(cry, is(CHIKEN_CROW_JA));

    // 特定のメソッドのみをMockしたい場合はspyメソッドを利用する
    Chicken chichen = spy(new Chicken());
    when(chichen.cry()).thenReturn(CHIKEN_CROW_JA);
    String cryThreeTimes = chichen.cryThreeTimes();
    assertThat(cryThreeTimes, is(CHIKEN_CROW_JA + "," + CHIKEN_CROW_JA + "," + CHIKEN_CROW_JA));
  }

}

サンプルコードリファクタリング

Eclipseリファクタリングメニューのみでメソッド名変更のリファクタリングを実施。
鶏が鳴く、はcryではなくcrowなのでcrowに変更。
djUnitの場合は、テストクラスの文字列指定部をテキスト置換で修正する必要がある。

package mockito;

public class Chicken {
  public String crow() {
    return "cock-a-doodle-doo";
  }

  public String crowThreeTimes() {
    return crow() + "," + crow() + "," + crow();
  }
}
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.junit.Test;

public class ChickenTest {

  private static final String CHIKEN_CROW_JA = "コケコッコー";

  @Test
  public void testCrowThreeTimes() {
    // クラスごとMockしたい場合はmockメソッドを利用する
    Chicken mock = mock(Chicken.class);
    when(mock.crow()).thenReturn(CHIKEN_CROW_JA);
    String cry = mock.crow();
    assertThat(cry, is(CHIKEN_CROW_JA));

    // 特定のメソッドのみをMockしたい場合はspyメソッドを利用する
    Chicken chichen = spy(new Chicken());
    when(chichen.crow()).thenReturn(CHIKEN_CROW_JA);
    String cryThreeTimes = chichen.crowThreeTimes();
    assertThat(cryThreeTimes, is(CHIKEN_CROW_JA + "," + CHIKEN_CROW_JA + "," + CHIKEN_CROW_JA));
  }
}