今回から新シリーズ「モック編」の始まりです。
タイトルに「最強」などと派手な名前をつけてしまいましたが、実際に最強と呼び声の高い強力な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 件のコメント:
コメントを投稿