在一个抽象类中测试私有方法,该抽象类继承另一个类。

3

我试图测试一个抽象类中的私有方法。

我有三个抽象类:

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)
    }
}

测试失败,因为出现了以下错误:
缺少参数1,调用了AbstractClass2::__construct(),位于/usr/share/php/PHPUnit/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 ...

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

你在哪里向构造函数传递参数? - Nathan Loding
1
可能是PhpUnit私有方法测试的重复问题。 - Gordon
1
Sebastian Bergmann的博客:测试您的private方法 - Gordon
@Nathan Loding:我将抽象类AbstractClass2的构造函数参数设置为可选的,但现在我遇到了与数据库适配器相关的异常。所以这不是我之前认为的测试问题。 - faramka
1
@Gordon:谢谢;https://dev59.com/Rm445IYBdhLWcg3wKHAJ 还有David Harkness发布的一些有趣的内容。 - faramka
2个回答

5
您需要向AbstractClass1的构造函数传递一个参数。将构造函数参数作为数组作为第二个参数传递给getMockForAbstractClass()
$stub = $this->getMockForAbstractClass("AbstractClass1", array('param'));

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 关键字不能用在变量前面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接