关于phpunit:如何对受保护的方法进行单元测试?

How to unit-test protected methods?

有没有办法对类的受保护或私有方法进行单元测试? 就像现在一样,我公开了许多方法,以便能够测试它们,这打破了API。

编辑:实际上在这里回答:使用PHPUnit测试受保护方法的最佳实践


对于受保护的方法,您可以对测试中的类进行子类化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo
{
    protected function doThings($foo)
    {
        //...
    }
}


class _Foo extends Foo
{
    public function _doThings($foo)
    {
        return $this->doThings($foo);
    }
}

并在测试中:

1
2
$sut = new _Foo();
$this->assertEquals($expected, $sut->_doThings($stuff));

使用私有方法会有点困难,您可以使用Reflection API来调用受保护的方法。 此外,有一种观点认为私有方法应该只在重构期间出现,所以应该由调用它们的公共方法覆盖,但只有在测试优先开始时才能真正起作用,并且在现实生活中我们有遗留代码 处理;)

反射api的链接:

http://php.net/manual/en/reflectionmethod.setaccessible.php

此外,此链接看起来很有用:

https://jtreminio.com/2013/03/unit-testing-tutorial-part-3-testing-protected-private-methods-coverage-reports-and-crap/