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動かすまでが大変ですが、最初に苦労してでも書いておくべきだなーと実感しました。
どうしても日々の業務に追われていると、目先の案件に囚われがちだったり、
実際時間もとれなかったりすることも多いですけどね。