From 29f04eb868a1e0d8eafa94dd3c34e954259a0c1c Mon Sep 17 00:00:00 2001 From: David Fox Date: Wed, 15 May 2019 10:36:40 -0400 Subject: [PATCH] Only allow new mock methods to configure once --- src/Framework/MockObject/MockBuilder.php | 17 ++++++++++++++++ .../Framework/MockObject/MockBuilderTest.php | 20 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/Framework/MockObject/MockBuilder.php b/src/Framework/MockObject/MockBuilder.php index c3c84fb645e..ff09628e5ff 100644 --- a/src/Framework/MockObject/MockBuilder.php +++ b/src/Framework/MockObject/MockBuilder.php @@ -83,6 +83,11 @@ final class MockBuilder */ private $generator; + /** + * @var bool + */ + private $alreadyUsedMockMethodConfiguration = false; + /** * @param array|string $type */ @@ -189,6 +194,12 @@ public function setMethods(array $methods = null): self */ public function onlyMethods(array $methods): self { + if ($this->alreadyUsedMockMethodConfiguration) { + throw new RuntimeException('Can\'t use onlyMethods after already configuring mock methods on the mock.'); + } + + $this->alreadyUsedMockMethodConfiguration = true; + $reflection = new \ReflectionClass($this->type); foreach ($methods as $method) { @@ -217,6 +228,12 @@ public function onlyMethods(array $methods): self */ public function addMethods(array $methods): self { + if ($this->alreadyUsedMockMethodConfiguration) { + throw new RuntimeException('Can\'t use addMethods after already configuring mock methods on the mock.'); + } + + $this->alreadyUsedMockMethodConfiguration = true; + $reflection = new \ReflectionClass($this->type); foreach ($methods as $method) { diff --git a/tests/unit/Framework/MockObject/MockBuilderTest.php b/tests/unit/Framework/MockObject/MockBuilderTest.php index e03f6e8986d..7c31c86d49a 100644 --- a/tests/unit/Framework/MockObject/MockBuilderTest.php +++ b/tests/unit/Framework/MockObject/MockBuilderTest.php @@ -108,6 +108,26 @@ public function testEmptyMethodExceptionsToMockCanBeSpecified(): void $this->assertNull($mock->anotherMockableMethod()); } + public function testNotAbleToUseAddMethodsAfterOnlyMethods(): void + { + $this->expectException(RuntimeException::class); + + $this->getMockBuilder(Mockable::class) + ->onlyMethods(['mockableMethod']) + ->addMethods(['mockableMethodWithFakeMethod']) + ->getMock(); + } + + public function testNotAbleToUseOnlyMethodsAfterAddMethods(): void + { + $this->expectException(RuntimeException::class); + + $this->getMockBuilder(Mockable::class) + ->addMethods(['mockableMethodWithFakeMethod']) + ->onlyMethods(['mockableMethod']) + ->getMock(); + } + public function testByDefaultDoesNotPassArgumentsToTheConstructor(): void { $mock = $this->getMockBuilder(Mockable::class)->getMock();