Chris@0: supports('getMock')) { Chris@0: $mock = $this->getMockBuilder($originalClassName) Chris@0: ->setMethods($methods) Chris@0: ->setConstructorArgs($arguments) Chris@0: ->setMockClassName($mockClassName) Chris@0: ->setProxyTarget($proxyTarget); Chris@0: if ($callOriginalConstructor) { Chris@0: $mock->enableOriginalConstructor(); Chris@0: } Chris@0: else { Chris@0: $mock->disableOriginalConstructor(); Chris@0: } Chris@0: if ($callOriginalClone) { Chris@0: $mock->enableOriginalClone(); Chris@0: } Chris@0: else { Chris@0: $mock->disableOriginalClone(); Chris@0: } Chris@0: if ($callAutoload) { Chris@0: $mock->enableAutoload(); Chris@0: } Chris@0: else { Chris@0: $mock->disableAutoload(); Chris@0: } Chris@0: if ($cloneArguments) { Chris@0: $mock->enableArgumentCloning(); Chris@0: } Chris@0: else { Chris@0: $mock->disableArgumentCloning(); Chris@0: } Chris@0: if ($callOriginalMethods) { Chris@0: $mock->enableProxyingToOriginalMethods(); Chris@0: } Chris@0: else { Chris@0: $mock->disableProxyingToOriginalMethods(); Chris@0: } Chris@0: return $mock->getMock(); Chris@0: } Chris@0: else { Chris@0: return parent::getMock($originalClassName, $methods, $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $cloneArguments, $callOriginalMethods, $proxyTarget); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns a mock object for the specified class using the available method. Chris@0: * Chris@0: * The createMock method does not exist in PHPUnit 4. To provide forward Chris@0: * compatibility this trait provides the createMock method and uses createMock Chris@0: * if this method is available on the parent class or falls back to getMock if Chris@0: * it isn't. Chris@0: * Chris@0: * @param string $originalClassName Chris@0: * Name of the class to mock. Chris@0: * Chris@0: * @see \PHPUnit_Framework_TestCase::getMock Chris@0: * Chris@0: * @return \PHPUnit_Framework_MockObject_MockObject Chris@0: */ Chris@0: public function createMock($originalClassName) { Chris@0: if ($this->supports('createMock')) { Chris@0: return parent::createMock($originalClassName); Chris@0: } Chris@0: else { Chris@0: return $this->getMock($originalClassName, [], [], '', FALSE, FALSE); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Compatibility layer for PHPUnit 6 to support PHPUnit 4 code. Chris@0: * Chris@0: * @param mixed $class Chris@0: * The expected exception class. Chris@0: * @param string $message Chris@0: * The expected exception message. Chris@0: * @param int $exception_code Chris@0: * The expected exception code. Chris@0: */ Chris@0: public function setExpectedException($class, $message = '', $exception_code = NULL) { Chris@0: if (method_exists($this, 'expectException')) { Chris@0: $this->expectException($class); Chris@0: if (!empty($message)) { Chris@0: $this->expectExceptionMessage($message); Chris@0: } Chris@0: if ($exception_code !== NULL) { Chris@0: $this->expectExceptionCode($exception_code); Chris@0: } Chris@0: } Chris@0: else { Chris@0: parent::setExpectedException($class, $message, $exception_code); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Checks if the trait is used in a class that has a method. Chris@0: * Chris@0: * @param string $method Chris@0: * Method to check. Chris@0: * Chris@0: * @return bool Chris@0: * TRUE if the method is supported, FALSE if not. Chris@0: */ Chris@0: private function supports($method) { Chris@0: // Get the parent class of the currently running test class. Chris@0: $parent = get_parent_class($this); Chris@0: // Ensure that the method_exists() check on the createMock method is carried Chris@0: // out on the first parent of $this that does not have access to this Chris@0: // trait's methods. This is because the trait also has a method called Chris@0: // createMock(). Most often the check will be made on Chris@0: // \PHPUnit\Framework\TestCase. Chris@0: while (method_exists($parent, 'supports')) { Chris@0: $parent = get_parent_class($parent); Chris@0: } Chris@0: return method_exists($parent, $method); Chris@0: } Chris@0: Chris@0: }