WebエンジニアのLoL日記

LoLをプレイしたりLJLの試合を見たりするのが好きなエンジニア。LoLのイベントやパッチノートなど気になった点を記事にしたり、LJLについの記事をかいたりしています。某社でWeb系のエンジニアとして働いているので、技術系の記事もたまに書きます。コンタクトを取りたい場合はtwitterまで。

PHP Mockeryでパーシャルモックなどを作る場合にコンストラクタがちゃんと呼ばれるようにしたい

Mockeryでパーシャルモックを作ることがある

<?php

class モックしたいクラス {

    public function __construct()
    {
        $this->repository = new Repository();
    }

    public function モックしたいメソッド() 
    {
    }

    public function モックしたくないメソッド()
    {
    }
}

// テスト

$mock = \Mockery::mock(モックしたクラス)->makePartial();
$mock->shouldReceive(モックしたいメソッド)
    ->andReturn($something);

しかしここで問題が出た。モックするとコンストラクタが呼ばれないので、$this->repository が new できなくてテスト中に死ぬ。

そもそも、コンストラクタの中でnewしていたり、パーシャルモックを使わなきゃテストできあにようなことをしているコードが悪いのだが、過去の遺産となってしまったコードでは仕方がないこともある。

コンストラクタを呼びたい場合はこうする

$mock = \Mockery::mock(モックしたクラス, [])->makePartial();

わかりやすく言うとこういうことだ

$mock = \Mockery::mock(モックしたクラス, [コンストラクタ引数1, コンストラクタ引数2, ...])->makePartial();

これでコンストラクタがきっちり呼ばれるようになり、$this->repositoryもちゃんとnewされるわけだ。めでたしめでたし。

参考