1. ホーム
  2. unit-testing

[解決済み] 抽象クラスのテスト

2022-04-28 08:48:53

質問

抽象クラスの具象メソッドを PHPUnit でテストするにはどうしたらいいのでしょう?

テストの一部として、ある種のオブジェクトを作成する必要があると思います。しかし、そのベストプラクティスやPHPUnitがそれを可能にしているかどうかはわかりません。

どのように解決するのですか?

抽象クラスは具象メソッドを持つことができ、この具象メソッドをテストすることができますので、抽象クラスのユニットテストは必ずしもインターフェイスをテストすることを意味しません。

ライブラリのコードを書くとき、アプリケーション層で拡張することを想定したベースクラスがあることは、それほど珍しいことではありません。そして、そのライブラリのコードを確実にテストしたいのであれば、抽象クラスの具象メソッドをUTする手段が必要です。

個人的にはPHPUnitを使っていますが、スタブやモックオブジェクトと呼ばれるものがあり、この種のテストを手助けしてくれます。

そのまま PHPUnitマニュアル :

abstract class AbstractClass
{
    public function concreteMethod()
    {
        return $this->abstractMethod();
    }

    public abstract function abstractMethod();
}

class AbstractClassTest extends PHPUnit_Framework_TestCase
{
    public function testConcreteMethod()
    {
        $stub = $this->getMockForAbstractClass('AbstractClass');
        $stub->expects($this->any())
             ->method('abstractMethod')
             ->will($this->returnValue(TRUE));

        $this->assertTrue($stub->concreteMethod());
    }
}

モックオブジェクトは、いくつかのことを与えてくれます。

  • 抽象クラスの具体的な実装を持つ必要がなく、スタブで代用することができます。
  • 具象メソッドを呼び出し、それが正しく動作することを保証することができます。
  • 具象メソッドが未実装の (抽象) メソッドに依存している場合は、will() PHPUnit メソッドで戻り値をスタブ化することができます。