PHPUnit:模拟抽象类中的方法返回null

时间:2017-10-23 15:47:22

标签: phpunit

我正在针对以下课程编写测试:

abstract class EmailMessageRecipient
{
    private $_address = null;

    public function setAddress($address)
    {
        $this->_address = $address;
        return $this;
    }

    public function getAddress()
    {
        return $this->_address;
    }

}

测试如下:

class EmailMessageRecipientTest extends PHPUnit_Framework_TestCase
{
    private $_test_object;

    protected function makeTestObject()
    {
        return $this->createMock(EmailMessageRecipient::class);
    }

    public function setUp()
    {
        $this->_test_object = $this->makeTestObject();
    }

    public function testAddress()
    {
        $this->_test_object->setAddress('blah@example.com');
        $this->assertEquals('blah@example.com', $this->_test_object->getAddress());
    }
}

PHPUnit使用消息Failed asserting that null matches expected 'blah@example.com'.使测试失败。因此$this->_test_object->getAddress()正在返回null而不是传递给它的电子邮件地址。为什么会发生这种情况,如何调整测试以使其通过。

模拟setAddress()getAddress()方法不是一个可接受的答案。此测试的目的是涵盖setAddress()getAddress()

1 个答案:

答案 0 :(得分:1)

如果您测试抽象类,则应使用:getMockForAbstractClass

  

getMockForAbstractClass()方法返回一个模拟对象   抽象类。给定抽象类的所有抽象方法都是   嘲笑。这允许测试抽象的具体方法   类。

     

例9.19:测试抽象类的具体方法

<?php
use PHPUnit\Framework\TestCase;

abstract class AbstractClass
{
    public function concreteMethod()
    {
        return $this->abstractMethod();
    }

    public abstract function abstractMethod();
}

class AbstractClassTest extends TestCase
{
    public function testConcreteMethod()
    {
        $stub = $this->getMockForAbstractClass(AbstractClass::class);

        $stub->expects($this->any())
             ->method('abstractMethod')
             ->will($this->returnValue(true));

        $this->assertTrue($stub->concreteMethod());
    }
}
?>