Chris@14: Chris@14: * Chris@14: * For the full copyright and license information, please view the LICENSE Chris@14: * file that was distributed with this source code. Chris@14: */ Chris@14: namespace PHPUnit\Framework\MockObject; Chris@14: Chris@14: use PHPUnit\Framework\TestCase; Chris@14: Chris@14: /** Chris@14: * Implementation of the Builder pattern for Mock objects. Chris@14: */ Chris@14: class MockBuilder Chris@14: { Chris@14: /** Chris@14: * @var TestCase Chris@14: */ Chris@14: private $testCase; Chris@14: Chris@14: /** Chris@14: * @var string Chris@14: */ Chris@14: private $type; Chris@14: Chris@14: /** Chris@14: * @var array Chris@14: */ Chris@14: private $methods = []; Chris@14: Chris@14: /** Chris@14: * @var array Chris@14: */ Chris@14: private $methodsExcept = []; Chris@14: Chris@14: /** Chris@14: * @var string Chris@14: */ Chris@14: private $mockClassName = ''; Chris@14: Chris@14: /** Chris@14: * @var array Chris@14: */ Chris@14: private $constructorArgs = []; Chris@14: Chris@14: /** Chris@14: * @var bool Chris@14: */ Chris@14: private $originalConstructor = true; Chris@14: Chris@14: /** Chris@14: * @var bool Chris@14: */ Chris@14: private $originalClone = true; Chris@14: Chris@14: /** Chris@14: * @var bool Chris@14: */ Chris@14: private $autoload = true; Chris@14: Chris@14: /** Chris@14: * @var bool Chris@14: */ Chris@14: private $cloneArguments = false; Chris@14: Chris@14: /** Chris@14: * @var bool Chris@14: */ Chris@14: private $callOriginalMethods = false; Chris@14: Chris@14: /** Chris@14: * @var object Chris@14: */ Chris@14: private $proxyTarget = null; Chris@14: Chris@14: /** Chris@14: * @var bool Chris@14: */ Chris@14: private $allowMockingUnknownTypes = true; Chris@14: Chris@14: /** Chris@14: * @var Generator Chris@14: */ Chris@14: private $generator; Chris@14: Chris@14: /** Chris@14: * @param TestCase $testCase Chris@14: * @param array|string $type Chris@14: */ Chris@14: public function __construct(TestCase $testCase, $type) Chris@14: { Chris@14: $this->testCase = $testCase; Chris@14: $this->type = $type; Chris@14: $this->generator = new Generator; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Creates a mock object using a fluent interface. Chris@14: * Chris@14: * @return MockObject Chris@14: */ Chris@14: public function getMock() Chris@14: { Chris@14: $object = $this->generator->getMock( Chris@14: $this->type, Chris@14: $this->methods, Chris@14: $this->constructorArgs, Chris@14: $this->mockClassName, Chris@14: $this->originalConstructor, Chris@14: $this->originalClone, Chris@14: $this->autoload, Chris@14: $this->cloneArguments, Chris@14: $this->callOriginalMethods, Chris@14: $this->proxyTarget, Chris@14: $this->allowMockingUnknownTypes Chris@14: ); Chris@14: Chris@14: $this->testCase->registerMockObject($object); Chris@14: Chris@14: return $object; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Creates a mock object for an abstract class using a fluent interface. Chris@14: * Chris@14: * @return MockObject Chris@14: */ Chris@14: public function getMockForAbstractClass() Chris@14: { Chris@14: $object = $this->generator->getMockForAbstractClass( Chris@14: $this->type, Chris@14: $this->constructorArgs, Chris@14: $this->mockClassName, Chris@14: $this->originalConstructor, Chris@14: $this->originalClone, Chris@14: $this->autoload, Chris@14: $this->methods, Chris@14: $this->cloneArguments Chris@14: ); Chris@14: Chris@14: $this->testCase->registerMockObject($object); Chris@14: Chris@14: return $object; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Creates a mock object for a trait using a fluent interface. Chris@14: * Chris@14: * @return MockObject Chris@14: */ Chris@14: public function getMockForTrait() Chris@14: { Chris@14: $object = $this->generator->getMockForTrait( Chris@14: $this->type, Chris@14: $this->constructorArgs, Chris@14: $this->mockClassName, Chris@14: $this->originalConstructor, Chris@14: $this->originalClone, Chris@14: $this->autoload, Chris@14: $this->methods, Chris@14: $this->cloneArguments Chris@14: ); Chris@14: Chris@14: $this->testCase->registerMockObject($object); Chris@14: Chris@14: return $object; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Specifies the subset of methods to mock. Default is to mock none of them. Chris@14: * Chris@14: * @param array|null $methods Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function setMethods(array $methods = null) Chris@14: { Chris@14: $this->methods = $methods; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Specifies the subset of methods to not mock. Default is to mock all of them. Chris@14: * Chris@14: * @param array $methods Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function setMethodsExcept(array $methods = []) Chris@14: { Chris@14: $this->methodsExcept = $methods; Chris@14: Chris@14: $this->setMethods( Chris@14: \array_diff( Chris@14: $this->generator->getClassMethods($this->type), Chris@14: $this->methodsExcept Chris@14: ) Chris@14: ); Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Specifies the arguments for the constructor. Chris@14: * Chris@14: * @param array $args Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function setConstructorArgs(array $args) Chris@14: { Chris@14: $this->constructorArgs = $args; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Specifies the name for the mock class. Chris@14: * Chris@14: * @param string $name Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function setMockClassName($name) Chris@14: { Chris@14: $this->mockClassName = $name; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Disables the invocation of the original constructor. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function disableOriginalConstructor() Chris@14: { Chris@14: $this->originalConstructor = false; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Enables the invocation of the original constructor. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function enableOriginalConstructor() Chris@14: { Chris@14: $this->originalConstructor = true; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Disables the invocation of the original clone constructor. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function disableOriginalClone() Chris@14: { Chris@14: $this->originalClone = false; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Enables the invocation of the original clone constructor. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function enableOriginalClone() Chris@14: { Chris@14: $this->originalClone = true; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Disables the use of class autoloading while creating the mock object. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function disableAutoload() Chris@14: { Chris@14: $this->autoload = false; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Enables the use of class autoloading while creating the mock object. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function enableAutoload() Chris@14: { Chris@14: $this->autoload = true; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Disables the cloning of arguments passed to mocked methods. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function disableArgumentCloning() Chris@14: { Chris@14: $this->cloneArguments = false; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Enables the cloning of arguments passed to mocked methods. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function enableArgumentCloning() Chris@14: { Chris@14: $this->cloneArguments = true; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Enables the invocation of the original methods. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function enableProxyingToOriginalMethods() Chris@14: { Chris@14: $this->callOriginalMethods = true; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Disables the invocation of the original methods. Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function disableProxyingToOriginalMethods() Chris@14: { Chris@14: $this->callOriginalMethods = false; Chris@14: $this->proxyTarget = null; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Sets the proxy target. Chris@14: * Chris@14: * @param object $object Chris@14: * Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function setProxyTarget($object) Chris@14: { Chris@14: $this->proxyTarget = $object; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function allowMockingUnknownTypes() Chris@14: { Chris@14: $this->allowMockingUnknownTypes = true; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: Chris@14: /** Chris@14: * @return MockBuilder Chris@14: */ Chris@14: public function disallowMockingUnknownTypes() Chris@14: { Chris@14: $this->allowMockingUnknownTypes = false; Chris@14: Chris@14: return $this; Chris@14: } Chris@14: }