【发布时间】:2011-03-06 00:39:50
【问题描述】:
我正在为一个使用mock调用另一个类的方法的类方法编写单元测试,只有需要调用的方法被声明为final,所以PHPUnit无法mock它。我可以采取其他方法吗?
示例:
要模拟的类
class Class_To_Mock
{
final public function needsToBeCalled($options)
{
...
}
}
我的测试用例
class MyTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$mock = $this->getMock('Class_To_Mock', array('needsToBeCalled'));
$mock->expects($this->once())
->method('needsToBeCalled')
->with($this->equalTo(array('option'));
}
}
编辑:如果使用 Mike B 提供的解决方案,并且您有一个用于您正在模拟的对象的 setter/getter 进行类型检查(以确保将正确的对象传递到 setter),您需要模拟您正在测试的类的 getter 并让它返回另一个模拟。
示例:
要模拟的类
class Class_To_Mock
{
final public function needsToBeCalled($options)
{
...
}
}
模拟
class Class_To_MockMock
{
public function needsToBeCalled($options)
{
...
}
}
要测试的类
class Class_To_Be_Tested
{
public function setClassToMock(Class_To_Mock $classToMock)
{
...
}
public function getClassToMock()
{
...
}
public function doSomething()
{
$this->getClassToMock()
->needsToBeCalled(array('option'));
}
}
我的测试用例
class MyTest extends PHPUnit_Framework_TestCase
{
public function testDoSomething()
{
$classToTest = $this->getMock('Class_To_Be_Tested', array('getClassToMock'));
$mock = $this->getMock('Class_To_MockMock', array('needsToBeCalled'));
$classToTest->expects($this->any())
->method('getClassToMock')
->will($this->returnValue($mock));
$mock->expects($this->once())
->method('needsToBeCalled')
->with($this->equalTo(array('option'));
$classToTest->doSomething();
}
}
【问题讨论】:
标签: php unit-testing mocking phpunit