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) {
-
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);
-
?>
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

