123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php
- /*
- * This file is part of the phpunit-mock-objects package.
- *
- * (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.
- */
- use PHPUnit\Framework\MockObject\Generator;
- use PHPUnit\Framework\MockObject\MockObject;
- use PHPUnit\Framework\TestCase;
- /**
- * @covers \PHPUnit\Framework\MockObject\Generator
- *
- * @uses \PHPUnit\Framework\MockObject\InvocationMocker
- * @uses \PHPUnit\Framework\MockObject\Builder\InvocationMocker
- * @uses \PHPUnit\Framework\MockObject\Invocation\ObjectInvocation
- * @uses \PHPUnit\Framework\MockObject\Invocation\StaticInvocation
- * @uses \PHPUnit\Framework\MockObject\Matcher
- * @uses \PHPUnit\Framework\MockObject\Matcher\InvokedRecorder
- * @uses \PHPUnit\Framework\MockObject\Matcher\MethodName
- * @uses \PHPUnit\Framework\MockObject\Stub\ReturnStub
- * @uses \PHPUnit\Framework\MockObject\Matcher\InvokedCount
- */
- class GeneratorTest extends TestCase
- {
- /**
- * @var Generator
- */
- private $generator;
- protected function setUp()
- {
- $this->generator = new Generator;
- }
- public function testGetMockFailsWhenInvalidFunctionNameIsPassedInAsAFunctionToMock()
- {
- $this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
- $this->generator->getMock(stdClass::class, [0]);
- }
- public function testGetMockCanCreateNonExistingFunctions()
- {
- $mock = $this->generator->getMock(stdClass::class, ['testFunction']);
- $this->assertTrue(method_exists($mock, 'testFunction'));
- }
- public function testGetMockGeneratorFails()
- {
- $this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
- $this->expectExceptionMessage('duplicates: "foo, bar, foo" (duplicate: "foo")');
- $this->generator->getMock(stdClass::class, ['foo', 'bar', 'foo']);
- }
- /**
- * @requires PHP 7
- */
- public function testGetMockBlacklistedMethodNamesPhp7()
- {
- $mock = $this->generator->getMock(InterfaceWithSemiReservedMethodName::class);
- $this->assertTrue(method_exists($mock, 'unset'));
- $this->assertInstanceOf(InterfaceWithSemiReservedMethodName::class, $mock);
- }
- public function testGetMockForAbstractClassDoesNotFailWhenFakingInterfaces()
- {
- $mock = $this->generator->getMockForAbstractClass(Countable::class);
- $this->assertTrue(method_exists($mock, 'count'));
- }
- public function testGetMockForAbstractClassStubbingAbstractClass()
- {
- $mock = $this->generator->getMockForAbstractClass(AbstractMockTestClass::class);
- $this->assertTrue(method_exists($mock, 'doSomething'));
- }
- public function testGetMockForAbstractClassWithNonExistentMethods()
- {
- $mock = $this->generator->getMockForAbstractClass(
- AbstractMockTestClass::class,
- [],
- '',
- true,
- true,
- true,
- ['nonexistentMethod']
- );
- $this->assertTrue(method_exists($mock, 'nonexistentMethod'));
- $this->assertTrue(method_exists($mock, 'doSomething'));
- }
- public function testGetMockForAbstractClassShouldCreateStubsOnlyForAbstractMethodWhenNoMethodsWereInformed()
- {
- $mock = $this->generator->getMockForAbstractClass(AbstractMockTestClass::class);
- $mock->expects($this->any())
- ->method('doSomething')
- ->willReturn('testing');
- $this->assertEquals('testing', $mock->doSomething());
- $this->assertEquals(1, $mock->returnAnything());
- }
- /**
- * @dataProvider getMockForAbstractClassExpectsInvalidArgumentExceptionDataprovider
- */
- public function testGetMockForAbstractClassExpectingInvalidArgumentException($className, $mockClassName)
- {
- $this->expectException(PHPUnit\Framework\Exception::class);
- $this->generator->getMockForAbstractClass($className, [], $mockClassName);
- }
- public function testGetMockForAbstractClassAbstractClassDoesNotExist()
- {
- $this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
- $this->generator->getMockForAbstractClass('Tux');
- }
- public function getMockForAbstractClassExpectsInvalidArgumentExceptionDataprovider()
- {
- return [
- 'className not a string' => [[], ''],
- 'mockClassName not a string' => [Countable::class, new stdClass],
- ];
- }
- public function testGetMockForTraitWithNonExistentMethodsAndNonAbstractMethods()
- {
- $mock = $this->generator->getMockForTrait(
- AbstractTrait::class,
- [],
- '',
- true,
- true,
- true,
- ['nonexistentMethod']
- );
- $this->assertTrue(method_exists($mock, 'nonexistentMethod'));
- $this->assertTrue(method_exists($mock, 'doSomething'));
- $this->assertTrue($mock->mockableMethod());
- $this->assertTrue($mock->anotherMockableMethod());
- }
- public function testGetMockForTraitStubbingAbstractMethod()
- {
- $mock = $this->generator->getMockForTrait(AbstractTrait::class);
- $this->assertTrue(method_exists($mock, 'doSomething'));
- }
- public function testGetMockForSingletonWithReflectionSuccess()
- {
- $mock = $this->generator->getMock(SingletonClass::class, ['doSomething'], [], '', false);
- $this->assertInstanceOf('SingletonClass', $mock);
- }
- public function testExceptionIsRaisedForMutuallyExclusiveOptions()
- {
- $this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
- $this->generator->getMock(stdClass::class, [], [], '', false, true, true, true, true);
- }
- /**
- * @requires PHP 7
- */
- public function testCanImplementInterfacesThatHaveMethodsWithReturnTypes()
- {
- $stub = $this->generator->getMock([AnInterfaceWithReturnType::class, AnInterface::class]);
- $this->assertInstanceOf(AnInterfaceWithReturnType::class, $stub);
- $this->assertInstanceOf(AnInterface::class, $stub);
- $this->assertInstanceOf(MockObject::class, $stub);
- }
- public function testCanConfigureMethodsForDoubleOfNonExistentClass()
- {
- $className = 'X' . md5(microtime());
- $mock = $this->generator->getMock($className, ['someMethod']);
- $this->assertInstanceOf($className, $mock);
- }
- public function testCanInvokeMethodsOfNonExistentClass()
- {
- $className = 'X' . md5(microtime());
- $mock = $this->generator->getMock($className, ['someMethod']);
- $mock->expects($this->once())->method('someMethod');
- $this->assertNull($mock->someMethod());
- }
- }
|