2013年8月17日土曜日

最強モックツール JMockit その1

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

今回から新シリーズ「モック編」の始まりです。

タイトルに「最強」などと派手な名前をつけてしまいましたが、実際に最強と呼び声の高い強力なJUnit支援ツールがあります。
それがモックツール「JMockit」です。
しかし、第一回である今回はJMockit個別の話の前に「モックとはなんぞや?」という所からご説明しましょう。

百聞は一見に如かず。まず、例をお見せします。


まず、以下のように「ジェニシス」という文字を返すだけの、シンプルなクラスを作ります。

public class Simple {
 public String getStr(){
  return "ジェニシス";
 }
}

これに対してテストケースを作り、System.out.printlnで出力結果を見てみます。
public class SimpleTest {
 @Test
 public void testGetStr() throws Exception {
  Simple simple = new Simple();
  System.out.println(simple.getStr());
 }
}

まあ、当然ながらコンソールには「ジェニシス」と出ます。当たり前です。

これに対し、モックを入れてみます。

public class SimpleTest {
 @Mocked
 private Simple mockSimple;
 @Test
 public void testGetStr() throws Exception {
  new NonStrictExpectations() {{
   mockSimple.getStr(); result = "モックになりました。";
        }};
  System.out.println(mockSimple.getStr());
 }
}

すると、コンソールには何故か「モックになりました。」と出てきてしまいました!?

不思議ですね。。。

本体ソースを見る限りはどうやったって「simple.getStr() == "ジェニシス"」以外にありえないのですが、
実際には違う値が出てきてしまいました。。。

このように「本体ソースの機能をダミーに差し替えて実行する」というハッキングみたいなことをする。
それがモックです。
テスト上の役割としては「スタブ」に近いものとなります。

定義の上では厳密言えば「スタブ」と「モック」は違うものなのですが、下位機能を本体とは別のソースで置換するという点は同じです。

本体ソースではテストが難しいケースに対し、ダミーの値に差し替えてテスト出来るというのがスタブの存在意義です。

モックの自作


上記のモックソースはJMockitを使った結果ですが、別にツールを使わなくても自分でモックすることは可能です。

public class SimpleTest {
 @Test
 public void testGetStr() throws Exception {
  Simple simple = simpleMock();
  System.out.println(simple.getStr());
 }
 private Simple simpleMock(){
  Simple mock = new Simple(){
         public String getStr(){
          return "モックになりました。";
         }
        };
        return mock;
 }
}

「Simpleを継承した別クラス」を作って、メソッドをオーバライドした上で差し替えてるわけです。
以下の部分がそれに該当します。

Simple mock = new Simple(){
  public String getStr(){
    return "モックになりました。";
  }

普通にクラスを継承して作るのでは無く、コードの中でクラスを作っています。
こういう書き方をしたクラスを「無名クラス」と言います。

今回私が作ったサンプルモックは低機能かつSimpleクラス専用ですが、JMockitを初めとした各種モックツールは、
これをどんなクラスにでも動的に対応してくれます。

動的対応には「リフレクション」という文字列からクラスを動的に生成する機能を使うのですが、
そこまで説明すると記事が長くなり過ぎるので割愛します。

それに、プライベートメソッドも容赦なく変えたり、クラスの中でnewしているクラスまで差し替えたりと何でもござれ。

でも、普通はこんなコーディングしませんよね。
このように、モックツールというのはJavaの中でも『黒魔術』とまで称される禁断のテクニックをフル活用した裏技ツールなのです。

モックツールの選別


さて、モックツールは世の中に沢山ありますので、どれを使うのが良いかという問題があります。
有名所と言えば以下辺りなんじゃないでしょうか?

  • EasyMock
  • Mockito
  • jMock

しかし、あえて私はタイトルにもありますように、JMockitを推したいと思います。
機能の豊富さが理由です。

以下のサイトをご覧下さい。


JMockitの公式サイトなので多少の贔屓が入っているのかもしれませんが、
やはり機能面では最強と見て間違い無いようです。

一方、「機能が多ければ使いこなすのも難しいのではないか?」という印象を受けるのも事実です。
しかし、逆に言えば使いこなせるだけの知識があれば無敵!!

ここは一つ、気合い入れて研究してみようではありませんか。

次回


次回から本格的にJMockitについて解説。
最初はインストール編です。

0 件のコメント:

コメントを投稿