如何在phpunit setUpBeforeClass方法中创建一个模拟对象?

时间:2011-10-18 10:38:57

标签: php unit-testing phpunit

我想在我的所有测试中都有一个模拟对象,所以我尝试在setUpBeforeClass()方法中创建它,但是这个方法是静态的,所以必须像这样静态调用getMockBuilder:

public static function setUpBeforeClass() {

  self::mocked_object = self::getMockBuilder('MockedClass')
  ->disableOriginalConstructor()
  ->getMock();

}

问题是无法静态调用getMockBuilder:

Argument 1 passed to PHPUnit_Framework_MockObject_MockBuilder::__construct() must be an instance of PHPUnit_Framework_TestCase, null given

是否有机会在setUpBeforeClass方法中构建模拟对象,或者每次测试之前是否必须构建它(在公共函数setUp()方法中?)

1 个答案:

答案 0 :(得分:5)

每个模拟对象都绑定到创建它的测试用例实例。由于setUpBeforeClass()是静态方法,因此它没有实例,也无法创建模拟对象。

相反,在setUp()或辅助方法中创建模拟,并将它们分配给实例变量或返回它们。

class MyServiceTest extends PHPUnit_Framework_TestCase
{
    function setUp() {
        $this->connection = $this->getMock('MyDatabaseConnection', array('connect', ...));
        $this->connection
                ->expects($this->once())
                ->method('connect');
    }

    function testLogin() {
        $this->connection
                ->expects($this->once())
                ->method('login')
                ->with('bob', 'p4ssw0rd');
        $service = new MyService($this->connection);
        self::assertTrue($service->login('bob', 'p4ssw0rd'));
    }
}
相关问题