mockeryとは
ReflectionClassやPHPUnit内蔵のMockBuilderを小難しく使わずとも2行でmock作れます。そうmockeryならね。
もうちょっと詳しく
とりあえずサンプル見てもらえると早いと思います。
<?php
$mock = Mockery::mock('Hoge');
$mock->shouldReceive('fuga')->andReturn('hogehogefugafuga!');
echo $mock->fuga(); // hogehogefugafuga!
Mockery::mock('Hoge');
で指定しているクラス名Hoge
は実在するクラスを指定すれば、そのクラスを継承したmockを作成するとのことです。
テキトーな文字列を指定した場合は空のクラスのmockを作成します。
これだけだとイマイチ凄さが分かりませんが、私が感動したのは下記の方法。
<?php
class Hoge
{
public static function getFugaName()
{
$fuga = new Fuga();
return $fuga->getName();
}
}
class Fuga
{
public function getName()
{
return 'fuga';
}
}
$mock = Mockery::mock('overload:Fuga');
$mock->shouldReceive('getName')->andReturn('overwritten fuga');
echo Hoge::getFugaName(); // overwritten fuga
なんと:overload
プレフィックスをつけることで、テスト対象(上の例の場合はHoge
)の内部で生成しているFuga
を上書きしてmockを使用させることができます。
Mockeryを使用する前は苦肉の策でメンバ変数や引数などでFuga
インスタンスを渡せる仕組みをHoge
に実装していて、あんまりイケてない感じがして好きじゃなかったのですがこんなにお手軽に解決できるとはびっくらぽんです。
もちろんPHPUnitのMockBuilderで可能な、引数によって返却値を変える仕組みや、once()
やtwice()
等のメソッドを呼ぶ回数に制限を掛ける等もできます。
さらにあれこれ返却値を決定する際に処理が必要な場合はandReturnUsing()
なんてものもあって至れり尽くせりです。
<?php
class Hoge
{
public static function foo()
{
$fuga = new Fuga();
return $fuga->fugaMethod('引数1', '引数2', '引数3');
}
public static function bar()
{
$fuga = new Fuga();
return $fuga->fugaMethod('引数4', '引数5', '引数6');
}
}
class Fuga
{
public function fugaMethod()
{
//何か色々処理
return true;
}
}
$mock = Mockery::mock('overload:Fuga');
$mock->shouldReceive('fugaMethod')->andReturnUsing(function() { return func_get_args(); });
$foo = Hoge::foo(); // array('引数1', '引数2', '引数3')
$bar = Hoge::bar(); // array('引数4', '引数5', '引数6')
参考にさせていただいたドキュメント
インストール方法や更なる使い方については下記の記事にて詳しく解説されておりますのでそちらを参照されると良いかと思います。
(というかcomposerならインストール一発です)
・Mockery 0.8.0 日本語ドキュメント
https://kore1server.com/202/Mockery+0.8.0+%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88
・「Mockery」を使ってサクッとPHPのテストを書いてみる
http://tech.aainc.co.jp/archives/3918
・MockeryとPHPUnitを使う(最低限)
http://qiita.com/zaburo/items/b559782179565bb1c538
最後に
ここまでお読みいただきありがとうございました。
皆様も良きMockeryライフを!v・。・v