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

