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