Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 调用具体子方法的单元测试抽象类方法_Php_Unit Testing_Phpunit - Fatal编程技术网

Php 调用具体子方法的单元测试抽象类方法

Php 调用具体子方法的单元测试抽象类方法,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,我有一个抽象类,它有一个抽象方法和一个具体方法 具体方法调用抽象方法并使用其返回值 如何模拟此返回值 所以抽象类是 abstract class MyAbstractClass { /** * @return array() */ abstract function tester(); /** * @return array() */ public function myconcrete() { $

我有一个抽象类,它有一个抽象方法和一个具体方法

具体方法调用抽象方法并使用其返回值

如何模拟此返回值

所以抽象类是

abstract class MyAbstractClass
{
    /**
     * @return array()
     */
    abstract function tester();

    /**
     * @return array()
     */
    public function myconcrete()
    {
        $value = $this->tester();  //Should be an array

        return array_merge($value, array("a","b","c");
    }
}
我想测试myconcrete方法,所以我想模拟tester的返回值——但它是在方法内部调用的


这可能吗?

是的,这是可能的。您的测试应该如下所示:

class MyTest extends PHPUnit_Framework_TestCase
{    
    public function testTester() {
        // mock only the method tester all other methods will keep unchanged
        $stub = $this->getMockBuilder('MyAbstractClass')
            ->setMethods(array('tester'))
            ->getMock();

        // configure the stub so that tester() will return an array
        $stub->expects($this->any())
            ->method('tester')
            ->will($this->returnValue(array('1', '2', '3')));

        // test myconcrete()
        $result = $stub->myconcrete();    

        // assert result is the correct array
        $this->assertEquals($result, array(
            '1', '2', '3', 'a', 'b', 'c' 
        )); 
    }
}
请注意,我使用的是phpunit3.7.10