Вход Регистрация
Файл: vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php
Строк: 415
<?php declare(strict_types=1);
/*
 * This file is part of PHPUnit.
 *
 * (c) Sebastian Bergmann <sebastian@phpunit.de>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace PHPUnitFrameworkMockObject;

use function 
array_diff;
use function 
array_merge;
use 
PHPUnitFrameworkTestCase;
use 
ReflectionClass;

/**
 * @psalm-template MockedType
 *
 * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
 */
final class MockBuilder
{
    
/**
     * @var TestCase
     */
    
private $testCase;

    
/**
     * @var string
     */
    
private $type;

    
/**
     * @var null|string[]
     */
    
private $methods = [];

    
/**
     * @var bool
     */
    
private $emptyMethodsArray false;

    
/**
     * @var string
     */
    
private $mockClassName '';

    
/**
     * @var array
     */
    
private $constructorArgs = [];

    
/**
     * @var bool
     */
    
private $originalConstructor true;

    
/**
     * @var bool
     */
    
private $originalClone true;

    
/**
     * @var bool
     */
    
private $autoload true;

    
/**
     * @var bool
     */
    
private $cloneArguments false;

    
/**
     * @var bool
     */
    
private $callOriginalMethods false;

    
/**
     * @var ?object
     */
    
private $proxyTarget;

    
/**
     * @var bool
     */
    
private $allowMockingUnknownTypes true;

    
/**
     * @var bool
     */
    
private $returnValueGeneration true;

    
/**
     * @var Generator
     */
    
private $generator;

    
/**
     * @param string|string[] $type
     *
     * @psalm-param class-string<MockedType>|string|string[] $type
     */
    
public function __construct(TestCase $testCase$type)
    {
        
$this->testCase  $testCase;
        
$this->type      $type;
        
$this->generator = new Generator;
    }

    
/**
     * Creates a mock object using a fluent interface.
     *
     * @throws PHPUnitFrameworkInvalidArgumentException
     * @throws ClassAlreadyExistsException
     * @throws ClassIsFinalException
     * @throws ClassIsReadonlyException
     * @throws DuplicateMethodException
     * @throws InvalidMethodNameException
     * @throws OriginalConstructorInvocationRequiredException
     * @throws ReflectionException
     * @throws RuntimeException
     * @throws UnknownTypeException
     *
     * @psalm-return MockObject&MockedType
     */
    
public function getMock(): MockObject
    
{
        
$object $this->generator->getMock(
            
$this->type,
            !
$this->emptyMethodsArray $this->methods null,
            
$this->constructorArgs,
            
$this->mockClassName,
            
$this->originalConstructor,
            
$this->originalClone,
            
$this->autoload,
            
$this->cloneArguments,
            
$this->callOriginalMethods,
            
$this->proxyTarget,
            
$this->allowMockingUnknownTypes,
            
$this->returnValueGeneration
        
);

        
$this->testCase->registerMockObject($object);

        return 
$object;
    }

    
/**
     * Creates a mock object for an abstract class using a fluent interface.
     *
     * @psalm-return MockObject&MockedType
     *
     * @throws PHPUnitFrameworkException
     * @throws ReflectionException
     * @throws RuntimeException
     */
    
public function getMockForAbstractClass(): MockObject
    
{
        
$object $this->generator->getMockForAbstractClass(
            
$this->type,
            
$this->constructorArgs,
            
$this->mockClassName,
            
$this->originalConstructor,
            
$this->originalClone,
            
$this->autoload,
            
$this->methods,
            
$this->cloneArguments
        
);

        
$this->testCase->registerMockObject($object);

        return 
$object;
    }

    
/**
     * Creates a mock object for a trait using a fluent interface.
     *
     * @psalm-return MockObject&MockedType
     *
     * @throws PHPUnitFrameworkException
     * @throws ReflectionException
     * @throws RuntimeException
     */
    
public function getMockForTrait(): MockObject
    
{
        
$object $this->generator->getMockForTrait(
            
$this->type,
            
$this->constructorArgs,
            
$this->mockClassName,
            
$this->originalConstructor,
            
$this->originalClone,
            
$this->autoload,
            
$this->methods,
            
$this->cloneArguments
        
);

        
$this->testCase->registerMockObject($object);

        return 
$object;
    }

    
/**
     * Specifies the subset of methods to mock. Default is to mock none of them.
     *
     * @deprecated https://github.com/sebastianbergmann/phpunit/pull/3687
     *
     * @return $this
     */
    
public function setMethods(?array $methods null): self
    
{
        if (
$methods === null) {
            
$this->methods $methods;
        } else {
            
$this->methods array_merge($this->methods ?? [], $methods);
        }

        return 
$this;
    }

    
/**
     * Specifies the subset of methods to mock, requiring each to exist in the class.
     *
     * @param string[] $methods
     *
     * @throws CannotUseOnlyMethodsException
     * @throws ReflectionException
     *
     * @return $this
     */
    
public function onlyMethods(array $methods): self
    
{
        if (empty(
$methods)) {
            
$this->emptyMethodsArray true;

            return 
$this;
        }

        try {
            
$reflector = new ReflectionClass($this->type);
            
// @codeCoverageIgnoreStart
        
} catch (ReflectionException $e) {
            throw new 
ReflectionException(
                
$e->getMessage(),
                
$e->getCode(),
                
$e
            
);
        }
        
// @codeCoverageIgnoreEnd

        
foreach ($methods as $method) {
            if (!
$reflector->hasMethod($method)) {
                throw new 
CannotUseOnlyMethodsException($this->type$method);
            }
        }

        
$this->methods array_merge($this->methods ?? [], $methods);

        return 
$this;
    }

    
/**
     * Specifies methods that don't exist in the class which you want to mock.
     *
     * @param string[] $methods
     *
     * @throws CannotUseAddMethodsException
     * @throws ReflectionException
     * @throws RuntimeException
     *
     * @return $this
     */
    
public function addMethods(array $methods): self
    
{
        if (empty(
$methods)) {
            
$this->emptyMethodsArray true;

            return 
$this;
        }

        try {
            
$reflector = new ReflectionClass($this->type);
            
// @codeCoverageIgnoreStart
        
} catch (ReflectionException $e) {
            throw new 
ReflectionException(
                
$e->getMessage(),
                
$e->getCode(),
                
$e
            
);
        }
        
// @codeCoverageIgnoreEnd

        
foreach ($methods as $method) {
            if (
$reflector->hasMethod($method)) {
                throw new 
CannotUseAddMethodsException($this->type$method);
            }
        }

        
$this->methods array_merge($this->methods ?? [], $methods);

        return 
$this;
    }

    
/**
     * Specifies the subset of methods to not mock. Default is to mock all of them.
     *
     * @deprecated https://github.com/sebastianbergmann/phpunit/pull/3687
     *
     * @throws ReflectionException
     */
    
public function setMethodsExcept(array $methods = []): self
    
{
        return 
$this->setMethods(
            
array_diff(
                
$this->generator->getClassMethods($this->type),
                
$methods
            
)
        );
    }

    
/**
     * Specifies the arguments for the constructor.
     *
     * @return $this
     */
    
public function setConstructorArgs(array $args): self
    
{
        
$this->constructorArgs $args;

        return 
$this;
    }

    
/**
     * Specifies the name for the mock class.
     *
     * @return $this
     */
    
public function setMockClassName(string $name): self
    
{
        
$this->mockClassName $name;

        return 
$this;
    }

    
/**
     * Disables the invocation of the original constructor.
     *
     * @return $this
     */
    
public function disableOriginalConstructor(): self
    
{
        
$this->originalConstructor false;

        return 
$this;
    }

    
/**
     * Enables the invocation of the original constructor.
     *
     * @return $this
     */
    
public function enableOriginalConstructor(): self
    
{
        
$this->originalConstructor true;

        return 
$this;
    }

    
/**
     * Disables the invocation of the original clone constructor.
     *
     * @return $this
     */
    
public function disableOriginalClone(): self
    
{
        
$this->originalClone false;

        return 
$this;
    }

    
/**
     * Enables the invocation of the original clone constructor.
     *
     * @return $this
     */
    
public function enableOriginalClone(): self
    
{
        
$this->originalClone true;

        return 
$this;
    }

    
/**
     * Disables the use of class autoloading while creating the mock object.
     *
     * @return $this
     */
    
public function disableAutoload(): self
    
{
        
$this->autoload false;

        return 
$this;
    }

    
/**
     * Enables the use of class autoloading while creating the mock object.
     *
     * @return $this
     */
    
public function enableAutoload(): self
    
{
        
$this->autoload true;

        return 
$this;
    }

    
/**
     * Disables the cloning of arguments passed to mocked methods.
     *
     * @return $this
     */
    
public function disableArgumentCloning(): self
    
{
        
$this->cloneArguments false;

        return 
$this;
    }

    
/**
     * Enables the cloning of arguments passed to mocked methods.
     *
     * @return $this
     */
    
public function enableArgumentCloning(): self
    
{
        
$this->cloneArguments true;

        return 
$this;
    }

    
/**
     * Enables the invocation of the original methods.
     *
     * @return $this
     */
    
public function enableProxyingToOriginalMethods(): self
    
{
        
$this->callOriginalMethods true;

        return 
$this;
    }

    
/**
     * Disables the invocation of the original methods.
     *
     * @return $this
     */
    
public function disableProxyingToOriginalMethods(): self
    
{
        
$this->callOriginalMethods false;
        
$this->proxyTarget         null;

        return 
$this;
    }

    
/**
     * Sets the proxy target.
     *
     * @return $this
     */
    
public function setProxyTarget(object $object): self
    
{
        
$this->proxyTarget $object;

        return 
$this;
    }

    
/**
     * @return $this
     */
    
public function allowMockingUnknownTypes(): self
    
{
        
$this->allowMockingUnknownTypes true;

        return 
$this;
    }

    
/**
     * @return $this
     */
    
public function disallowMockingUnknownTypes(): self
    
{
        
$this->allowMockingUnknownTypes false;

        return 
$this;
    }

    
/**
     * @return $this
     */
    
public function enableAutoReturnValueGeneration(): self
    
{
        
$this->returnValueGeneration true;

        return 
$this;
    }

    
/**
     * @return $this
     */
    
public function disableAutoReturnValueGeneration(): self
    
{
        
$this->returnValueGeneration false;

        return 
$this;
    }
}
Онлайн: 1
Реклама