当前路径:vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php <?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 PHPUnit\Framework\MockObject\Builder; use PHPUnit\Framework\Constraint\Constraint; use PHPUnit\Framework\MockObject\ConfigurableMethod; use PHPUnit\Framework\MockObject\IncompatibleReturnValueException; use PHPUnit\Framework\MockObject\InvocationHandler; use PHPUnit\Framework\MockObject\Matcher; use PHPUnit\Framework\MockObject\Rule; use PHPUnit\Framework\MockObject\RuntimeException; use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls; use PHPUnit\Framework\MockObject\Stub\Exception; use PHPUnit\Framework\MockObject\Stub\ReturnArgument; use PHPUnit\Framework\MockObject\Stub\ReturnCallback; use PHPUnit\Framework\MockObject\Stub\ReturnReference; use PHPUnit\Framework\MockObject\Stub\ReturnSelf; use PHPUnit\Framework\MockObject\Stub\ReturnStub; use PHPUnit\Framework\MockObject\Stub\ReturnValueMap; use PHPUnit\Framework\MockObject\Stub\Stub; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ final class InvocationMocker implements InvocationStubber, MethodNameMatch { /** * @var InvocationHandler */ private $invocationHandler; /** * @var Matcher */ private $matcher; /** * @var ConfigurableMethod[] */ private $configurableMethods; public function __construct(InvocationHandler $handler, Matcher $matcher, ConfigurableMethod ...$configurableMethods) { $this->invocationHandler = $handler; $this->matcher = $matcher; $this->configurableMethods = $configurableMethods; } /** * @return $this */ public function id($id): self { $this->invocationHandler->registerMatcher($id, $this->matcher); return $this; } /** * @return $this */ public function will(Stub $stub): Identity { $this->matcher->setStub($stub); return $this; } public function willReturn($value, ...$nextValues): self { if (\count($nextValues) === 0) { $this->ensureTypeOfReturnValues([$value]); $stub = $value instanceof Stub ? $value : new ReturnStub($value); } else { $values = \array_merge([$value], $nextValues); $this->ensureTypeOfReturnValues($values); $stub = new ConsecutiveCalls($values); } return $this->will($stub); } /** {@inheritDoc} */ public function willReturnReference(&$reference): self { $stub = new ReturnReference($reference); return $this->will($stub); } public function willReturnMap(array $valueMap): self { $stub = new ReturnValueMap($valueMap); return $this->will($stub); } public function willReturnArgument($argumentIndex): self { $stub = new ReturnArgument($argumentIndex); return $this->will($stub); } /** {@inheritDoc} */ public function willReturnCallback($callback): self { $stub = new ReturnCallback($callback); return $this->will($stub); } public function willReturnSelf(): self { $stub = new ReturnSelf; return $this->will($stub); } public function willReturnOnConsecutiveCalls(...$values): self { $stub = new ConsecutiveCalls($values); return $this->will($stub); } public function willThrowException(\Throwable $exception): self { $stub = new Exception($exception); return $this->will($stub); } /** * @return $this */ public function after($id): self { $this->matcher->setAfterMatchBuilderId($id); return $this; } /** * @throws RuntimeException * * @return $this */ public function with(...$arguments): self { $this->canDefineParameters(); $this->matcher->setParametersRule(new Rule\Parameters($arguments)); return $this; } /** * @param array ...$arguments * * @throws RuntimeException * * @return $this */ public function withConsecutive(...$arguments): self { $this->canDefineParameters(); $this->matcher->setParametersRule(new Rule\ConsecutiveParameters($arguments)); return $this; } /** * @throws RuntimeException * * @return $this */ public function withAnyParameters(): self { $this->canDefineParameters(); $this->matcher->setParametersRule(new Rule\AnyParameters); return $this; } /** * @param Constraint|string $constraint * * @throws RuntimeException * * @return $this */ public function method($constraint): self { if ($this->matcher->hasMethodNameRule()) { throw new RuntimeException( 'Rule for method name is already defined, cannot redefine' ); } $configurableMethodNames = \array_map( static function (ConfigurableMethod $configurable) { return \strtolower($configurable->getName()); }, $this->configurableMethods ); if (\is_string($constraint) && !\in_array(\strtolower($constraint), $configurableMethodNames, true)) { throw new RuntimeException( \sprintf( 'Trying to configure method "%s" which cannot be configured because it does not exist, has not been specified, is final, or is static', $constraint ) ); } $this->matcher->setMethodNameRule(new Rule\MethodName($constraint)); return $this; } /** * Validate that a parameters rule can be defined, throw exceptions otherwise. * * @throws RuntimeException */ private function canDefineParameters(): void { if (!$this->matcher->hasMethodNameRule()) { throw new RuntimeException( 'Rule for method name is not defined, cannot define rule for parameters ' . 'without one' ); } if ($this->matcher->hasParametersRule()) { throw new RuntimeException( 'Rule for parameters is already defined, cannot redefine' ); } } private function getConfiguredMethod(): ?ConfigurableMethod { $configuredMethod = null; foreach ($this->configurableMethods as $configurableMethod) { if ($this->matcher->getMethodNameRule()->matchesName($configurableMethod->getName())) { if ($configuredMethod !== null) { return null; } $configuredMethod = $configurableMethod; } } return $configuredMethod; } private function ensureTypeOfReturnValues(array $values): void { $configuredMethod = $this->getConfiguredMethod(); if ($configuredMethod === null) { return; } foreach ($values as $value) { if (!$configuredMethod->mayReturn($value)) { throw new IncompatibleReturnValueException( \sprintf( 'Method %s may not return value of type %s, its return declaration is "%s"', $configuredMethod->getName(), \is_object($value) ? \get_class($value) : \gettype($value), $configuredMethod->getReturnTypeDeclaration() ) ); } } } }
相关源码
- 可旋转的彩色立方体C#源代码2021-10-29
- 在线考试系统2021-10-15
- EduSoho开源网校系统源码2019-06-27
- 仿拼多多小程序商城源码2019-06-06
- PHP5网站运行监测系统源码2017-04-14
关于我们 | 顾问团队 | 发展历程 | 联系我们 | 源码上传
联系电话(Tel):4008-010-151(免长途)
地址:北京市海淀区大恒科技大厦五层 邮编:100080
Floor 5th,Daheng Building,Zhongguancun,Beijing,China,100080
51Aspx.com 版权所有 CopyRight © 2006-2022. 京ICP备09089570号 | 京公网安备11010702000869号
联系电话(Tel):4008-010-151(免长途)
地址:北京市海淀区大恒科技大厦五层 邮编:100080
Floor 5th,Daheng Building,Zhongguancun,Beijing,China,100080
51Aspx.com 版权所有 CopyRight © 2006-2022. 京ICP备09089570号 | 京公网安备11010702000869号