また,
/**
* Item.phpにはItemクラスもしくはItemインターフェースが定義してある
*/
include_once 'Item.php';
$mock = $this->getMock('Item', array(), array(), 'AnotherItem');
この場合,
PHPUnit3のモックオブジェクト機能は,
- 実行回数の制約を設ける
- メソッド名を指定する
- 具体的な振る舞いを記述する
を指定する必要があります。
1つ目の
なお,
また,
- メソッドの戻り値
- メソッドが投げる例外
のいずれかが指定可能で,
以下,
<?php
class MockTest extends PHPUnit_Framework_TestCase
{
public function testMock() {
:
$mock = $this->getMock('Item', array('getName', 'getCode', 'getPrice'));
/**
* getNameメソッドは一度だけ呼び出され,文字列「item001」を返す
*/
$mock->expects($this->once())
->method('getName')
->will($this->returnValue('item001'));
/**
* getCodeメソッドはゼロ回以上呼び出され,1回目の呼び出し時は「001」,
* 2回目の呼び出し時は「002」,3回目の呼び出し時は「100」を返す。
* なお,4回目以降はNULLを返す。
*/
$mock->expects($this->any())
->method('getCode')
->will($this->onConsecutiveCalls('001', '002', '100'));
/**
* getNameメソッドは少なくとも一度は呼び出され,呼び出されると
* RuntimeExceptionを投げる
*/
$mock->expects($this->atLeastOnce())
->method('getPrice')
->will($this->throwException(new RuntimeException()));
:
}
}
また,
以下,
<?php
class MockTest extends PHPUnit_Framework_TestCase
{
public function testMock() {
:
$mock = $this->getMock('Item', array('setCode', 'setData'));
/**
* setCodeメソッドは第1引数にオブジェクト型,第2引数に42より
* 大きな数を受け取る
*/
$mock->expects($this->any())
->method('setCode')
->with('item001'); // ->with($this->equalsTo('item001')) と等価
/**
* setDataメソッドは第1引数に「001」,第2引数にオブジェクト型,
* 第3引数に42より大きな数を受け取る
*/
$mock->expects($this->any())
->method('setData')
->with('001', $this->isType('object'), $this->greaterThan(42));
:
}
}
具体的な制約クラスについては,