PHPUnit3がリリースされました。このバージョンにはMockがサポートされているのですが、PHPUnit3はPHP5を対象としているので残念ながらPHP4では動作しません。ですのでPHP4対応のPHPUnitでMockクラスを使う方法を探ってみました。
使うのはPHPUnitと並ぶユニットテストツールのSimpleTestです。こちらはPHP4対応でMockクラスがサポートされています。これをPHPUnitと組み合わせて使ってみます。
SimpleTestインストール
PEARパッケージが以前はあったようなのですが、sourceforgeにはそれらしいものが見当たりませんでした。
zuzara : symfonyチュートリアル実践【第14~16日目】を参考に以下のコマンドでインストールしました。
$ 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 require_once 'simpletest/mock_objects.php'; class PHPUnitMock extends SimpleMock { function PHPUnitMock($test, $wildcard) { $this->SimpleMock($test, $wildcard); } } SimpleTestOptions::setMockBaseClass('PHPUnitMock'); ?>
テスト対象クラス
テスト対象のクラスはこちらです。selectCount()はテーブル名を引数に取り、テーブルのレコード数を整数で返します。擬似的に処理時間が100秒かかるようにしています。
< ?php class Database { function selectCount($table) { sleep(100); return null; } } ?>
テストケース
Databaseクラスのテストケースを記述します。Mockクラスを使用することに定義した処理結果[100]がすぐに返ってきます。
< ?php require_once 'PHPUnit.php'; require_once 'PHPUnitMock.php'; require_once 'Database.php'; Mock::generate('Database'); class DatabaseTest extends PHPUnit_TestCase { function DatabaseTest ($name) { $this->PHPUnit_TestCase($name); } function setup() { } function testQuery() { $mock =& new MockDatabase($this); $mock->setReturnValue('selectCount', 100, 'users'); $ret = $mock->selectCount('users'); $this->assertEquals($ret, 100); } } $suite = new PHPUnit_TestSuite('DatabaseTest'); $result = PHPUnit::run($suite); echo $result->toString(); ?>
SimpleTestはMockクラスの他にHTTPテストも行えるなど高機能なのですが、すでにPHPUnitを使用していたので今更移行するのも億劫でした。あとはコードカバレッジも使えると良いのですが。;-)
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2006/11/php_phpunit_mock.html/trackback
- Listed below are links to weblogs that reference
- PHPUnitでMockオブジェクトを使う from Shin x blog