JMockit - ユニットテストモックフレームワーク

JMockitはJavaのユニットテスト(単体テスト)用モックフレームワークである。

JMockitのアノテーション

JMockitのアノテーションを次の表に示す。

JMockitのアノテーション
アノテーション 説明
@Mocked モックの対象となるインスタンス

@Mocked

@mockit.Mockedは、モックの対象となるインスタンスを示すアノテーションである。

@Mockedアノテーションが付けられたインスタンスはコンストラクタやメソッドの実装が空となり、利用するメソッドに対してnew Expectations() { }で動作を設定する。

テスト対象ソースコード

package com.segakuin.jmockit.example;

final class Hello {
  public final String getString() {
      return "Hello, world!";
  }
}

JUnitテストコード

import org.junit.Test;
import mockit.Expectations;
import mockit.Mocked;

public class HelloTest {

  @Mocked
  private Hello hello;

  @Test
  public void testGetString() {
      new Expectations() {
          {
              hello.getString();
              result = "Mock";
          }
      };

      String s = hello.getString();

  }
}

Expectations

Expectationsはモックの挙動を定義し、Expectationsに書かれたモックメソッドが呼ばれることをチェックする。

new Expectations() {
  {
      // モックの定義
  }
};

テストコードのnew Expectations() {{ }};内でモックメソッドを定義する際に任意の引数を定義できる。

データ型 クラス
Boolean anyBoolean
Byte anyByte
Char anyChar
Short anyShort
Int anyInt
Float anyFloat
Double anyDouble
String anyString
Object anyObject

NonStrictExpectations

Expectationsはモックの挙動定義に加えてExpectationsに書かれたモックメソッドが呼ばれることをチェックしている。

NonStrictExpectationsはモックの挙動を定義するだけで、NonStrictExpectationsに書かれたモックメソッドが呼ばれることはチェックしない。

new NonStrictExpectations() {
  {
      // モックの定義
  }
};

Verifications

Verificationsには検証用コードを記述する。

new Verifications(){
  {
      // 検証コード
  }
};

withCapture

モックメソッドに渡ってきたパラメータを引数をassertするには、withCaptureを使う。

new Verifications(){
  {
      List<Sring> strList = new ArrayList<String>();
      hello.setMessage(withCapture(strList));
      assertThat(strList.get(0), is("test"));
  }
};