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