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

时间:2013-06-04 12:35:41

标签: php unit-testing phpunit

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

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

如何嘲笑此返回值?

所以抽象类是

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方法,所以我想模拟test的返回值 - 但是在方法内部调用它?

这可能吗?

1 个答案:

答案 0 :(得分:3)

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

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

请注意,我正在使用PHPUnit 3.7.10