Mockeryでパーシャルモックを作ることがある
<?php class モックしたいクラス { public function __construct() { $this->repository = new Repository(); } public function モックしたいメソッド() { } public function モックしたくないメソッド() { } } // テスト $mock = \Mockery::mock(モックしたいクラス::class)->makePartial(); $mock->shouldReceive(モックしたいメソッド) ->andReturn($something);
これだと、モックしたいクラス
のコンストラクタが呼ばれないので、$this->repository = new Repository()
がされない。*1
コンストラクタを呼びたい場合はこうする
<?php $mock = \Mockery::mock(モックしたいクラス::class, [])->makePartial();
mockの第ニ引数で、コンストラクタにわたす変数を指定できる。今回、コンストラクタに渡したい変数は無いが、空配列にしておくとコンストラクタが呼ばれるようになる。
コンストラ引数がある場合はこう。
<?php $mock = \Mockery::mock(モックしたクラス, [コンストラクタ引数1, コンストラクタ引数2, ...])->makePartial();
これでコンストラクタが呼ばれるようになり、$this->repository = new Repository()
が実行される。
参考
*1:そもそも、コンストラクタの中でnewしていたり、パーシャルモックを使わなきゃテストできないのが悪いのだが、レガシーコードなので仕方ない時もある。