在抽象类中测试私有方法是对另一个方法的扩展


Testing a private method in an abstract class extends the other one

我正在尝试测试一个抽象类中的私有方法。

我有三个抽象类:

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,在/usr/share/php/phunit/framework/mockobject/generator .php第190行调用并定义

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 ...

我做错了什么?或者在这种情况下如何测试我的私有函数?

您需要传递一个参数给AbstractClass1的构造函数。将数组中的构造函数参数作为第二个参数传递给getMockForAbstractClass()

$stub = $this->getMockForAbstractClass("AbstractClass1", array('param'));

考虑到您重写了原始构造函数,

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关键字