なおのつぼやき

Webエンジニアです。PHP/Laravel、あとRustを少々

Mockeryを使った時にコンストラクタを呼んだり、呼ばなかったりする

PHPUnitでテストを書く時にMockeryを使ってモックを作成した際に
コンストラクタを呼びたい時と呼びたくない時の書き方をメモしておく

環境

検証用コード

<?php

namespace Sample;

class TestClass
{
    public function __construct()
    {
        echo PHP_EOL . '__construct' . PHP_EOL;
    }

    public function method(): bool
    {
        echo PHP_EOL . 'method' . PHP_EOL;

        return true;
    }
}
<?php

namespace Tests;

use PHPUnit\Framework\TestCase;
use Sample\TestClass;
use Mockery as m;

class TestClassTest extends TestCase
{
    public function test1()
    {
        // コンストラクタが呼ばれない
        $mock1 = m::mock(TestClass::class)->makePartial();

        $this->assertTrue($mock1->method());
    }

    public function test2()
    {
        // コンストラクタが呼ばれる
        $mock2 = m::mock(TestClass::class, [])->makePartial();

        $this->assertTrue($mock2->method());
    }
}

結果

$ vendor/bin/phpunit tests/TestClassTest.php --testdox
PHPUnit 9.2.6 by Sebastian Bergmann and contributors.

Class (Tests\Class)1

method
 ✔  2

__construct

method

Time: 00:00.050, Memory: 6.00 MB

OK (2 tests, 2 assertions)

1では__constructが出力されない 2では__constructが出力される

まとめ

コンストラクタを呼びたい時は、mockメソッドの第2引数を指定してあげればいい

参考

www.utakata.work

readouble.com