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 }
|