darudaru

だるだるしてるエンジニア

PHPUnitのモックを使う

PHPUnitで既存プログラムのテストコードを書くときに、PHPUnitに用意されているモックを使ってみたので備忘録。

テストコード書く前にconstructで別オブジェクトを呼び出すという依存性の高いコードだったので、切り出す改修もしています。

改修後のテスト対象はこんなプログラム。改修前はconstructの中でオブジェクトをnewしてました。

<?php

class Subject{
    private $obj1;
    private $obj2;

    public function __construct($obj1, $obj2){
        $this->obj1 = $obj1;
        $this->obj2 = $obj2;
    }

    public function main(){
    }
}

$subject = new Subject(new Obj1, new Obj2)

 

PHPUnitのgetMockBuilder()を使う

createMock()を使ってモックを作成しようと思っていたのですが、

そんなメソッド無いよとエラーが出てしまい使えませんでした。

PHPUnitのバージョン問題かなあ。

getMockBuilder()は問題無く使えたので、そっちを使うことに。

<?php

class SubjectTest extends PHPUnit_Framework_TestCase{
    public $object;

    protected function setUp() {
        $obj1 = $this->getMockBuilder( 'Test_Obj1' ) ->getMock();
        $obj2 = $this->getMockBuilder( 'Test_Obj2' ) ->getMock();
        $this->object = new Subject($obj1, $obj2);
    }
}

うん。簡単。

モックにメソッド追加したりできるようですが、

オブジェクトがコンストラクタに渡せればそれでよかったので、これでよし。

 

おまけ

テスト対象の既存プログラムは最後に改修されたのが2年前。

プログラムを改修したことがあるメンバーはもはや皆退職しているという、中身がよく分からないプログラムでした。

もちろんテストコードもありません。

今回の改修時にPHPUnitでテストコードを書いたは書いたのですが、

上記にあげたnew問題以外にも依存性がある箇所が多くあり、

PHPUnitを動かせるようにするだけで結構大変で、途中で挫折しかけました。

ただ、今回改修する箇所のテストパターンも多いこと、影響範囲のことを考えると、

テストコード書いておかないと辛いなと思い直し、テストコードを書いてました。

おかげでテストがだいぶ楽に。

PHPUnit動かすまでが大変ですが、最初に苦労してでも書いておくべきだなーと実感しました。

どうしても日々の業務に追われていると、目先の案件に囚われがちだったり、

実際時間もとれなかったりすることも多いですけどね。