annotate vendor/phpunit/phpunit-mock-objects/tests/GeneratorTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 1fec387a4317
children
rev   line source
Chris@0 1 <?php
Chris@14 2 /*
Chris@14 3 * This file is part of the phpunit-mock-objects package.
Chris@14 4 *
Chris@14 5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
Chris@14 6 *
Chris@14 7 * For the full copyright and license information, please view the LICENSE
Chris@14 8 * file that was distributed with this source code.
Chris@14 9 */
Chris@14 10
Chris@14 11 use PHPUnit\Framework\MockObject\Generator;
Chris@14 12 use PHPUnit\Framework\MockObject\MockObject;
Chris@14 13 use PHPUnit\Framework\TestCase;
Chris@14 14
Chris@14 15 /**
Chris@14 16 * @covers \PHPUnit\Framework\MockObject\Generator
Chris@14 17 *
Chris@14 18 * @uses \PHPUnit\Framework\MockObject\InvocationMocker
Chris@14 19 * @uses \PHPUnit\Framework\MockObject\Builder\InvocationMocker
Chris@14 20 * @uses \PHPUnit\Framework\MockObject\Invocation\ObjectInvocation
Chris@14 21 * @uses \PHPUnit\Framework\MockObject\Invocation\StaticInvocation
Chris@14 22 * @uses \PHPUnit\Framework\MockObject\Matcher
Chris@14 23 * @uses \PHPUnit\Framework\MockObject\Matcher\InvokedRecorder
Chris@14 24 * @uses \PHPUnit\Framework\MockObject\Matcher\MethodName
Chris@14 25 * @uses \PHPUnit\Framework\MockObject\Stub\ReturnStub
Chris@14 26 * @uses \PHPUnit\Framework\MockObject\Matcher\InvokedCount
Chris@14 27 */
Chris@14 28 class GeneratorTest extends TestCase
Chris@0 29 {
Chris@0 30 /**
Chris@14 31 * @var Generator
Chris@0 32 */
Chris@14 33 private $generator;
Chris@0 34
Chris@0 35 protected function setUp()
Chris@0 36 {
Chris@14 37 $this->generator = new Generator;
Chris@14 38 }
Chris@14 39
Chris@14 40 public function testGetMockFailsWhenInvalidFunctionNameIsPassedInAsAFunctionToMock()
Chris@14 41 {
Chris@14 42 $this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
Chris@14 43
Chris@14 44 $this->generator->getMock(stdClass::class, [0]);
Chris@14 45 }
Chris@14 46
Chris@14 47 public function testGetMockCanCreateNonExistingFunctions()
Chris@14 48 {
Chris@14 49 $mock = $this->generator->getMock(stdClass::class, ['testFunction']);
Chris@14 50
Chris@14 51 $this->assertTrue(method_exists($mock, 'testFunction'));
Chris@14 52 }
Chris@14 53
Chris@14 54 public function testGetMockGeneratorFails()
Chris@14 55 {
Chris@14 56 $this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
Chris@14 57 $this->expectExceptionMessage('duplicates: "foo, bar, foo" (duplicate: "foo")');
Chris@14 58
Chris@14 59 $this->generator->getMock(stdClass::class, ['foo', 'bar', 'foo']);
Chris@0 60 }
Chris@0 61
Chris@0 62 /**
Chris@14 63 * @requires PHP 7
Chris@0 64 */
Chris@14 65 public function testGetMockBlacklistedMethodNamesPhp7()
Chris@0 66 {
Chris@14 67 $mock = $this->generator->getMock(InterfaceWithSemiReservedMethodName::class);
Chris@14 68
Chris@14 69 $this->assertTrue(method_exists($mock, 'unset'));
Chris@14 70 $this->assertInstanceOf(InterfaceWithSemiReservedMethodName::class, $mock);
Chris@0 71 }
Chris@0 72
Chris@0 73 public function testGetMockForAbstractClassDoesNotFailWhenFakingInterfaces()
Chris@0 74 {
Chris@14 75 $mock = $this->generator->getMockForAbstractClass(Countable::class);
Chris@14 76
Chris@0 77 $this->assertTrue(method_exists($mock, 'count'));
Chris@0 78 }
Chris@0 79
Chris@0 80 public function testGetMockForAbstractClassStubbingAbstractClass()
Chris@0 81 {
Chris@14 82 $mock = $this->generator->getMockForAbstractClass(AbstractMockTestClass::class);
Chris@14 83
Chris@0 84 $this->assertTrue(method_exists($mock, 'doSomething'));
Chris@0 85 }
Chris@0 86
Chris@0 87 public function testGetMockForAbstractClassWithNonExistentMethods()
Chris@0 88 {
Chris@0 89 $mock = $this->generator->getMockForAbstractClass(
Chris@14 90 AbstractMockTestClass::class,
Chris@14 91 [],
Chris@0 92 '',
Chris@0 93 true,
Chris@0 94 true,
Chris@0 95 true,
Chris@14 96 ['nonexistentMethod']
Chris@0 97 );
Chris@0 98
Chris@0 99 $this->assertTrue(method_exists($mock, 'nonexistentMethod'));
Chris@0 100 $this->assertTrue(method_exists($mock, 'doSomething'));
Chris@0 101 }
Chris@0 102
Chris@0 103 public function testGetMockForAbstractClassShouldCreateStubsOnlyForAbstractMethodWhenNoMethodsWereInformed()
Chris@0 104 {
Chris@14 105 $mock = $this->generator->getMockForAbstractClass(AbstractMockTestClass::class);
Chris@0 106
Chris@0 107 $mock->expects($this->any())
Chris@0 108 ->method('doSomething')
Chris@0 109 ->willReturn('testing');
Chris@0 110
Chris@0 111 $this->assertEquals('testing', $mock->doSomething());
Chris@0 112 $this->assertEquals(1, $mock->returnAnything());
Chris@0 113 }
Chris@0 114
Chris@0 115 /**
Chris@0 116 * @dataProvider getMockForAbstractClassExpectsInvalidArgumentExceptionDataprovider
Chris@0 117 */
Chris@0 118 public function testGetMockForAbstractClassExpectingInvalidArgumentException($className, $mockClassName)
Chris@0 119 {
Chris@14 120 $this->expectException(PHPUnit\Framework\Exception::class);
Chris@14 121
Chris@14 122 $this->generator->getMockForAbstractClass($className, [], $mockClassName);
Chris@0 123 }
Chris@0 124
Chris@0 125 public function testGetMockForAbstractClassAbstractClassDoesNotExist()
Chris@0 126 {
Chris@14 127 $this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
Chris@14 128
Chris@14 129 $this->generator->getMockForAbstractClass('Tux');
Chris@0 130 }
Chris@0 131
Chris@14 132 public function getMockForAbstractClassExpectsInvalidArgumentExceptionDataprovider()
Chris@0 133 {
Chris@14 134 return [
Chris@14 135 'className not a string' => [[], ''],
Chris@14 136 'mockClassName not a string' => [Countable::class, new stdClass],
Chris@14 137 ];
Chris@0 138 }
Chris@0 139
Chris@0 140 public function testGetMockForTraitWithNonExistentMethodsAndNonAbstractMethods()
Chris@0 141 {
Chris@0 142 $mock = $this->generator->getMockForTrait(
Chris@14 143 AbstractTrait::class,
Chris@14 144 [],
Chris@0 145 '',
Chris@0 146 true,
Chris@0 147 true,
Chris@0 148 true,
Chris@14 149 ['nonexistentMethod']
Chris@0 150 );
Chris@0 151
Chris@0 152 $this->assertTrue(method_exists($mock, 'nonexistentMethod'));
Chris@0 153 $this->assertTrue(method_exists($mock, 'doSomething'));
Chris@0 154 $this->assertTrue($mock->mockableMethod());
Chris@0 155 $this->assertTrue($mock->anotherMockableMethod());
Chris@0 156 }
Chris@0 157
Chris@0 158 public function testGetMockForTraitStubbingAbstractMethod()
Chris@0 159 {
Chris@14 160 $mock = $this->generator->getMockForTrait(AbstractTrait::class);
Chris@14 161
Chris@0 162 $this->assertTrue(method_exists($mock, 'doSomething'));
Chris@0 163 }
Chris@0 164
Chris@0 165 public function testGetMockForSingletonWithReflectionSuccess()
Chris@0 166 {
Chris@14 167 $mock = $this->generator->getMock(SingletonClass::class, ['doSomething'], [], '', false);
Chris@0 168
Chris@0 169 $this->assertInstanceOf('SingletonClass', $mock);
Chris@0 170 }
Chris@0 171
Chris@14 172 public function testExceptionIsRaisedForMutuallyExclusiveOptions()
Chris@0 173 {
Chris@14 174 $this->expectException(\PHPUnit\Framework\MockObject\RuntimeException::class);
Chris@0 175
Chris@14 176 $this->generator->getMock(stdClass::class, [], [], '', false, true, true, true, true);
Chris@0 177 }
Chris@0 178
Chris@0 179 /**
Chris@14 180 * @requires PHP 7
Chris@0 181 */
Chris@14 182 public function testCanImplementInterfacesThatHaveMethodsWithReturnTypes()
Chris@0 183 {
Chris@14 184 $stub = $this->generator->getMock([AnInterfaceWithReturnType::class, AnInterface::class]);
Chris@0 185
Chris@14 186 $this->assertInstanceOf(AnInterfaceWithReturnType::class, $stub);
Chris@14 187 $this->assertInstanceOf(AnInterface::class, $stub);
Chris@14 188 $this->assertInstanceOf(MockObject::class, $stub);
Chris@14 189 }
Chris@14 190
Chris@14 191 public function testCanConfigureMethodsForDoubleOfNonExistentClass()
Chris@14 192 {
Chris@14 193 $className = 'X' . md5(microtime());
Chris@14 194
Chris@14 195 $mock = $this->generator->getMock($className, ['someMethod']);
Chris@14 196
Chris@14 197 $this->assertInstanceOf($className, $mock);
Chris@14 198 }
Chris@14 199
Chris@14 200 public function testCanInvokeMethodsOfNonExistentClass()
Chris@14 201 {
Chris@14 202 $className = 'X' . md5(microtime());
Chris@14 203
Chris@14 204 $mock = $this->generator->getMock($className, ['someMethod']);
Chris@14 205
Chris@14 206 $mock->expects($this->once())->method('someMethod');
Chris@14 207
Chris@14 208 $this->assertNull($mock->someMethod());
Chris@0 209 }
Chris@0 210 }