この記事の所要時間: 約 3分38秒
PHPUnitでMockオブジェクトを使うで紹介したMockオブジェクトですが、これは元クラスを継承しているわけではないので当然ながら元クラスの実装は使えません。
ただテストする場面によっては、基本は元クラスの振る舞いをして、一部のメソッドだけMockにしたいという場合があります。
そこで元クラスを継承したMockオブジェクトを作ってみます。
元クラス
< ?php class Hoge { // このメソッドはそのまま function execute() { if ($this->request()) { // OK return 1; } else { // NG return -1; } } // このメソッドをMockにしたい function request(&$db) { $db->query(); sleep(100); return true; } } ?>
テストケース
Mockオブジェクトをテストケースに書いています。単にHogeクラスを継承してrequest()をオーバーライドするだけです。
< ?php require_once 'PHPUnit.php'; require_once 'Hoge.php'; class MockHoge extends Hoge { function request() { return true; } } class HogeTest extends PHPUnit_TestCase { function testExecute() { $obj = new MockHoge(); $this->assertTrue($obj->execute()); } } $suite = new PHPUnit_TestSuite('HogeTest'); $result = PHPUnit::run($suite); echo $result->toString(); ?>
テストケース-返り値を設定
こちらではMockHogeに変数を追加して、インスタンス変数に応じてrequest()メソッドの返り値が変わるようにしています。
< ?php require_once 'PHPUnit.php'; require_once 'Hoge.php'; class MockHoge extends Hoge { var $mockRequestValue; function request() { return $this->mockRequestValue; } } class HogeTest extends PHPUnit_TestCase { function testExecute() { $obj = new MockHoge(); $obj->mockRequestValue = true; $this->assertEquals(1, $obj->execute()); $obj->mockRequestValue = false; $this->assertEquals(-1, $obj->execute()); } } $suite = new PHPUnit_TestSuite('HogeTest'); $result = PHPUnit::run($suite); echo $result->toString(); ?>
この方法では(Mockオブジェクト用の)コンポーネントは必要ないので手軽にMockオブジェクトを使う事ができます。また元クラスの実装を生かせるのでこの例のように一部だけを変えたい場合には有用です。
SimpleTestのようなMockオブジェクトとケースバイケースで使い分けるのが良いですね。
- Newer: Remember The Milkでタスク管理
- Older: エンジニアのための時間管理術
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2006/11/php_phpunit_mock2.html/trackback
- Listed below are links to weblogs that reference
- PHPUnitでMockオブジェクトを使う2 from Shin x blog