PHPUnitで抽象クラスをテストする

最近知ったのでメモ。自分はあんまりテスト力がないなぁ、もう少し掘り下げたい。

元々抽象クラス内でも実装がされる事はあるのでそのメソッドなどをテストする場合はどうすれば良いのだろうか?という疑問から調べてみた。

結果

getMockForAbstractClass というモック作成を利用してテストする。

<?php
abstract class Example
{
    abstract public function getName();

    public function toString()
    {
        return "Name: {$this->getName()}";
    }
}

上記のように「getName」はメソッド定義を強制されているもの。「toString」は Example 側で実装されて共有化されて利用されるもの。このような Example クラスがあった場合の「toString」メソッドのテスト方法は以下

<?php
final class ExampleTest extends PHPUnit\Framework\TestCase
{
    public function test_getNameで設定した名前をtoStringで整形して返す()
    {

        $expected = 'Name: Hoge Fuga'; // 期待する値

        $stub = $this->getMockForAbstractClass(Example::class);

        $stub->expects($this->any()) // 呼び出し回数指定(anyはいつでも)
                ->method('getName') // getNameメソッドの指定
                ->will($this->returnValue('Hoge Fuga')); // getNameメソッドが返すであろう値

        $actual = $stub->toString(); // toStringメソッドの設定

        $this->assertEquals($extected, $actual);
    }
}

こんな感じ。修行が足りんなー。

参考