LoginSignup
12
13

More than 5 years have passed since last update.

たった2行で自動テスト時のmockが作れちゃうmockeryに感動したのでポエムを綴ってみました

Posted at

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

12
13
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13