Java

JavaのモックライブラリJMockitの初歩的な使い方

投稿日:2017年3月25日 更新日:

テスト中のプログラマ

テスト中のプログラマ

実装や単体試験中にはモックが欲しくなるもの。
Javaのモックライブラリは複数あるが、JMockitの使い方について。
ここに書いたこと以外にも色々できる強力なライブラリだ。

入手する

公式サイトからダウンロードしてくるか、Mavenのpom.xmlに既述を追加する。
Eclipseでビルドパスを設定するときjMockitがjUnitより上になってないないとうまく動かないことがあるので注意。

モックを作る

作り方は3通り。

1.アノテーション

public class テストクラス {
  @Mocked
  モックにするクラス mock;
  
  @Test
  public void テスト() {
    //なにかテスト
  }
}

とっても簡単。もし、特定のメソッドだけモックにしたければ以下のようにすればできる。
privateなメソッドも指定できるし、カンマで区切れば複数のメソッドも指定できる。

@Mocked(methods={"モックにするメソッド名"})

2.メソッドの引数

public class テストクラス {
  @Test
  public void テスト(モックにしたいクラス mock) {
    //なにかテスト
  }
}

この場合はアノテーションを省略できる。また、テストごとにモックの内容も変えやすい。

3.挙動を指定

@Test
public void テスト(@Mocked final モックにしたいクラス mock) {
  new Expectations() {{
    mock.doSomething(anyString); result = 123;
  }};

  //何かテスト
}

これは少し読みづらい。
モックにしたmockのdoSomethingメソッドを何か適当なStringを引数にして実行すると「123」が返ってくる。
これでロジックの実装がなくても期待結果を返すモックを作れる。

テストする

1.モックの動作を定義
2.テストしたいメソッドを実行
3.モックが呼ばれたか(呼ばれてないか)を確認
の順で行う。

public class テストクラス {
  @Mocked
  モックにするクラス mock;
  
  @Test
  public void テスト() {
    //動作定義
    new NonStrictExpectations() {
      {
        //モックにするクラスのmocked()が呼ばれたらtrueを返す
        mock.mocked(); result = true;
      }
    };

  //テスト対象を実行(中でmock.mocked()を呼んでいるメソッド)
  new テスト対象().テスト対象のメソッド();

  //呼ばれたかの確認
  new VerificationsInOrder() {
    {
      mock.mocked();
    }
  };
}

動作定義と確認のところで使うクラスは他にも種類がある。
呼ばれる順番を気にするかとか、かかれてないメソッドが呼ばれたらNGにするとかを選べる。
引数があるメソッドのモックだと受け取ったものによって動作を変える事もできる。

その他

privateなメンバーへのアクセス

//privateメソッドを呼ぶ
Deencapsulation.invoke(対象のオブジェクト, "メソッド名", メソッドのパラメータ...);
//privateなフィールドにセットする
Deencapsulation.setField(対象のオブジェクト, セットしたいオブジェクト);

これも合わせるとほどんどなんでもできる。

実行速度

結構遅いです。テスト始まる前に時間がかかる印象。

酔いどれまさになう。

-Java
-, , ,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

ソフトウェアテスト

Javaで無理やりシングルトンをモックにする方法

シングルトンのオブジェクトを使っているクラスをテストしたいときどうするか? 今回はMockitoを使って実現する。 ちなみに、最初からDIを使っていればこんなことはしなくてもいい。 Mockito J …

カテゴリー