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

Adi*_*tol 4 php phpunit unit-testing

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

public static function setUpBeforeClass() {

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

}
Run Code Online (Sandbox Code Playgroud)

问题是无法静态调用getMockBuilder:

Argument 1 passed to PHPUnit_Framework_MockObject_MockBuilder::__construct() must be an instance of PHPUnit_Framework_TestCase, null given
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ess 5

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

而是在in setUp()或helper方法中创建你的模拟,并将它们分配给实例变量或返回它们.

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'));
    }
}
Run Code Online (Sandbox Code Playgroud)