猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

【PHP】Mockeryでパーシャルモックを作る際に、コンストラクタが呼ばれるようにしたい

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していたり、パーシャルモックを使わなきゃテストできないのが悪いのだが、レガシーコードなので仕方ない時もある。