我正在尝试在抽象类中测试私有方法。
我有三个抽象类:
abstract class AbstractClass1 extends AbstractClass2
{
private function _privateFunction()
{
//method's body
}
}
abstract class AbstractClass2 extends AbstractClass3
{
public function __construct($param)
{
parent::__construct($param)
}
}
abstract class AbstractClass3
{
public function __construct($param = array())
{
//something
}
}
测试类:
class AbstractClass1Test extends PHPUnit_Framework_TestCase
{
public function test_privateFunction()
{
$stub = $this->getMockForAbstractClass("AbstractClass1");
$class = new ReflectionClass($stub);
$method = $class->getMethod("_privateFunction");
$method->setAccessible(true);
//some assertings with $method->invoke($stub)
}
}
测试失败,因为错误:
缺少AbstractClass2 :: __ construct()的参数1,在第190行的/usr/share/php/PHPUnit/Framework/MockObject/Generator.php中调用并定义
AbstractClass2.php
public function __construct($param)
AbstractClass1.php
$classMock = $this->getMockForAbstractClass("AbstractClass1");
Generator.php:190
if ($callOriginalConstructor &&
!interface_exists($originalClassName, $callAutoload)) {
if (count($arguments) == 0) {
<strong>$mockObject = new $mock['mockClassName'];</strong>
} else {
$mockClass = new ReflectionClass($mock['mockClassName']);
$mockObject = $mockClass->newInstanceArgs($arguments);
}
} else ...
我错了什么?或者我如何在这种情况下测试我的私人功能?
答案 0 :(得分:6)
您需要将参数传递给AbstractClass1
的构造函数。将数组中的构造函数参数作为getMockForAbstractClass()
的第二个参数传递。
$stub = $this->getMockForAbstractClass("AbstractClass1", array('param'));
答案 1 :(得分:0)
看到你覆盖原始构造函数,
public function __construct($param = array()) //Allow null $param as it would default to array();
使用新的:
public function __construct($param) //Does not allow null $param.
初始化对象时,您需要定义$param
。这可能是你的问题。
PHP中的对象与JavaScript不同,它们不能像关联数组那样被调用。您的对象初始化应如下所示:
$mockObject = new ClassExtendingAbstractClass1Or2('parameter');
new
关键字不能用在变量前面。