diff --git a/src/Framework/MockObject/MockBuilder.php b/src/Framework/MockObject/MockBuilder.php index aec32a2d443..7499b8ba882 100644 --- a/src/Framework/MockObject/MockBuilder.php +++ b/src/Framework/MockObject/MockBuilder.php @@ -208,6 +208,8 @@ public function getMockForTrait(): MockObject */ public function setMethods(?array $methods = null): self { + $this->createWarning('setMethods() and setMethodsExcept() methods are deprecated and will be removed in PHPUnit 10. Refactor your code to use addMethods() and onlyMethods() instead.'); + if ($methods === null) { $this->methods = $methods; } else { @@ -513,4 +515,24 @@ public function disableAutoReturnValueGeneration(): self return $this; } + + /** + * @codeCoverageIgnore + */ + private function createWarning(string $warning): void + { + foreach (debug_backtrace() as $step) { + if (!isset($step['object']) || !$step['object'] instanceof TestCase) { + continue; + } + + if ($step['function'] === 'createPartialMock') { + return; + } + + $step['object']->addWarning($warning); + + return; + } + } } diff --git a/tests/_files/TestWithDifferentStatuses.php b/tests/_files/TestWithDifferentStatuses.php index efe7731f28b..37781f1366a 100644 --- a/tests/_files/TestWithDifferentStatuses.php +++ b/tests/_files/TestWithDifferentStatuses.php @@ -60,4 +60,16 @@ public function testWithCreatePartialMockPassesNoWarning(): void $this->assertNull($mock->mockableMethod()); } + + public function testWithSetMethodsWarning(): void + { + $mockBuilder = $this->getMockBuilder(Mockable::class); + $mockBuilder->setMethods(['mockableMethod', 'anotherMockableMethod']); + } + + public function testWithSetMethodsExceptWarning(): void + { + $mockBuilder = $this->getMockBuilder(Mockable::class); + $mockBuilder->setMethodsExcept(['mockableMethod', 'anotherMockableMethod']); + } } diff --git a/tests/unit/Framework/MockObject/MockBuilderTest.php b/tests/unit/Framework/MockObject/MockBuilderTest.php index b9ff7cf342f..fb40810f95c 100644 --- a/tests/unit/Framework/MockObject/MockBuilderTest.php +++ b/tests/unit/Framework/MockObject/MockBuilderTest.php @@ -44,15 +44,6 @@ public function testMethodsToMockCanBeSpecified(): void $this->assertTrue($mock->anotherMockableMethod()); } - public function testSetMethodsAllowsNonExistentMethodNames(): void - { - $mock = $this->getMockBuilder(Mockable::class) - ->setMethods(['mockableMethodWithCrazyName']) - ->getMock(); - - $this->assertNull($mock->mockableMethodWithCrazyName()); - } - public function testOnlyMethodsWithNonExistentMethodNames(): void { $this->expectException(CannotUseOnlyMethodsException::class); @@ -139,58 +130,6 @@ public function testAbleToUseOnlyMethodsAfterAddMethods(): void $this->assertNull($mock->mockableMethod()); } - public function testAbleToUseSetMethodsAfterOnlyMethods(): void - { - $mock = $this->getMockBuilder(Mockable::class) - ->onlyMethods(['mockableMethod']) - ->setMethods(['mockableMethodWithCrazyName']) - ->getMock(); - - $this->assertNull($mock->mockableMethodWithCrazyName()); - } - - public function testAbleToUseSetMethodsAfterAddMethods(): void - { - $mock = $this->getMockBuilder(Mockable::class) - ->addMethods(['notAMethod']) - ->setMethods(['mockableMethodWithCrazyName']) - ->getMock(); - - $this->assertNull($mock->mockableMethodWithCrazyName()); - } - - public function testAbleToUseAddMethodsAfterSetMethods(): void - { - $mock = $this->getMockBuilder(Mockable::class) - ->setMethods(['mockableMethod']) - ->addMethods(['mockableMethodWithFakeMethod']) - ->getMock(); - - $this->assertNull($mock->mockableMethod()); - $this->assertNull($mock->mockableMethodWithFakeMethod()); - } - - public function testAbleToUseOnlyMethodsAfterSetMethods(): void - { - $mock = $this->getMockBuilder(Mockable::class) - ->setMethods(['mockableMethodWithFakeMethod']) - ->onlyMethods(['mockableMethod']) - ->getMock(); - - $this->assertNull($mock->mockableMethod()); - $this->assertNull($mock->mockableMethodWithFakeMethod()); - } - - public function testAbleToUseAddMethodsAfterSetMethodsWithNull(): void - { - $mock = $this->getMockBuilder(Mockable::class) - ->setMethods() - ->addMethods(['mockableMethodWithFakeMethod']) - ->getMock(); - - $this->assertNull($mock->mockableMethodWithFakeMethod()); - } - public function testByDefaultDoesNotPassArgumentsToTheConstructor(): void { $mock = $this->getMockBuilder(Mockable::class)->getMock(); diff --git a/tests/unit/Framework/TestCaseTest.php b/tests/unit/Framework/TestCaseTest.php index 9d2169f7813..ac370012a50 100644 --- a/tests/unit/Framework/TestCaseTest.php +++ b/tests/unit/Framework/TestCaseTest.php @@ -1317,6 +1317,26 @@ public function testSetDependencyInput(): void $this->assertCount(1, $result); } + public function testMockBuilderSetMethodsWarning(): void + { + $test = new TestWithDifferentStatuses('testWithSetMethodsWarning'); + + $test->run(); + + $this->assertSame(BaseTestRunner::STATUS_WARNING, $test->getStatus()); + $this->assertFalse($test->hasFailed()); + } + + public function testMockBuilderSetMethodsExceptWarning(): void + { + $test = new TestWithDifferentStatuses('testWithSetMethodsExceptWarning'); + + $test->run(); + + $this->assertSame(BaseTestRunner::STATUS_WARNING, $test->getStatus()); + $this->assertFalse($test->hasFailed()); + } + /** * @return array */