Home > PHP | 開発環境 > PHPUnitでMockオブジェクトを使う

PHPUnitでMockオブジェクトを使う

  • 2006-11-23 (木) 16:56
  • PHP | 開発環境
  • このエントリーをはてなブックマークに追加
この記事の所要時間: 347

PHPUnit3がリリースされました。このバージョンにはMockがサポートされているのですが、PHPUnit3はPHP5を対象としているので残念ながらPHP4では動作しません。ですのでPHP4対応のPHPUnitでMockクラスを使う方法を探ってみました。

使うのはPHPUnitと並ぶユニットテストツールのSimpleTestです。こちらはPHP4対応でMockクラスがサポートされています。これをPHPUnitと組み合わせて使ってみます。

SimpleTestインストール

PEARパッケージが以前はあったようなのですが、sourceforgeにはそれらしいものが見当たりませんでした。
zuzara : symfonyチュートリアル実践【第14~16日目】を参考に以下のコマンドでインストールしました。

CODE:
  1. $ pear install http://jaist.dl.sourceforge.net/sourceforge/simpletest/simpletest_1.0.0.tgz

PEARパッケージが見つからない場合でもsourceforgeからソースを取得してinclude_pathで参照できる位置に配置すればOKです。

PHPUnit用Mockクラス

SimpleTestのSimpleMockを継承してPHPUnitで使うMockクラスを記述します。

PHP:
  1. <?php
  2. require_once 'simpletest/mock_objects.php';
  3.  
  4. class PHPUnitMock extends SimpleMock {
  5.   function PHPUnitMock($test, $wildcard) {
  6.     $this->SimpleMock($test, $wildcard);
  7.   }
  8. }
  9. SimpleTestOptions::setMockBaseClass('PHPUnitMock');
  10. ?>

テスト対象クラス

テスト対象のクラスはこちらです。selectCount()はテーブル名を引数に取り、テーブルのレコード数を整数で返します。擬似的に処理時間が100秒かかるようにしています。

PHP:
  1. <?php
  2. class Database {
  3.   function selectCount($table) {
  4.     sleep(100);
  5.     return null;
  6.   }
  7. }
  8. ?>

テストケース

Databaseクラスのテストケースを記述します。Mockクラスを使用することに定義した処理結果[100]がすぐに返ってきます。

PHP:
  1. <?php
  2. require_once 'PHPUnit.php';
  3. require_once 'PHPUnitMock.php';
  4. require_once 'Database.php';
  5.  
  6. Mock::generate('Database');
  7.  
  8. class DatabaseTest extends PHPUnit_TestCase {
  9.   function DatabaseTest ($name) {
  10.     $this->PHPUnit_TestCase($name);
  11.   }
  12.  
  13.   function setup() {
  14.   }
  15.  
  16.   function testQuery() {
  17.     $mock =& new MockDatabase($this);
  18.     $mock->setReturnValue('selectCount', 100, 'users');
  19.  
  20.     $ret = $mock->selectCount('users');
  21.     $this->assertEquals($ret, 100);
  22.   }
  23. }
  24.  
  25. $suite = new PHPUnit_TestSuite('DatabaseTest');
  26. $result = PHPUnit::run($suite);
  27. echo $result->toString();
  28. ?>

SimpleTestはMockクラスの他にHTTPテストも行えるなど高機能なのですが、すでにPHPUnitを使用していたので今更移行するのも億劫でした。あとはコードカバレッジも使えると良いのですが。;-)

トラックバック:0

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2006/11/php_phpunit_mock.html/trackback
Listed below are links to weblogs that reference
PHPUnitでMockオブジェクトを使う from Shin x blog

Home > PHP | 開発環境 > PHPUnitでMockオブジェクトを使う

検索
フィード
メタ情報

Return to page top