メソッド等の戻り値が期待するものであるかどうかは、assertEquals()等のassertXXXメソッドを使用しましたが、 例外が発生することを確認するためのテストは、expectedExceptionアノテーションを使用します。
使用例を見ながら解説します。
まず、説明のために、光の3原色を表す、RGBクラスを作成します。
このクラスは、コンストラクタ引数に0から255までの値を3つ取得します。
もしもそれ以外の値を受け取った場合、InvalidArgumentExceptionを投げます。
<?php
class RGB {
var $red;
var $green;
var $blue;
public function __construct($red, $green, $blue) {
if ($red < 0 || $red > 255) {
throw new InvalidArgumentException();
} else if ($green < 0 || $green > 255) {
throw new InvalidArgumentException();
} else if ($blue < 0 || $blue > 255) {
throw new InvalidArgumentException();
}
}
public function getRed() {
return $this->red;
}
public function getGreen() {
return $this->green;
}
public function getBlue() {
return $this->blue;
}
}
?>
RGBクラスのコンストラクタに、正しくない値を指定した時にはInvalidArgumentExceptionが発生することを確認するためのテストは次のようになります。
<?php
require_once 'PHPUnit/Framework.php';
require_once 'RGB.php';
class RGBTest extends PHPUnit_Framework_TestCase {
public static function myDataProvider() {
return Array(
Array(-1,0,0),
Array(256,255,255)
);
}
/**
* @dataProvider myDataProvider
* @expectedException InvalidArgumentException
*/
public function testConstructorError($red, $green, $blue) {
new RGB($red, $green, $blue);
}
}
?>
testConstructorError()メソッドの最初のアノテーションは、PHPUnitデータプロバイダを使うためのものです。
myDataProvider()メソッドが、データプロバイダになります。
2番目のアノテーションである「@expectedException」で、 testConstructorError()メソッドの内部でInvalidArgumentExceptionの発生を期待することを宣言しています。
このアノテーションによって、testConstructorError()メソッド内のテストでは、InvalidArgumentExceptionが発生すればテストは成功となります。
逆に言えば、もしもtestConstructorError()メソッドの中でInvalidArgumentExceptionが発生しないと、テストは失敗になります。
このテストを実行した結果です。
C:\>aphpunit RGBTest PHPUnit 3.2.19 by Sebastian Bergmann. .. Time: 0 seconds OK (2 tests)