Chris@14
|
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 namespace PHPUnit\Framework\MockObject;
|
Chris@14
|
11
|
Chris@14
|
12 use PHPUnit\Framework\TestCase;
|
Chris@14
|
13
|
Chris@14
|
14 /**
|
Chris@14
|
15 * Implementation of the Builder pattern for Mock objects.
|
Chris@14
|
16 */
|
Chris@14
|
17 class MockBuilder
|
Chris@14
|
18 {
|
Chris@14
|
19 /**
|
Chris@14
|
20 * @var TestCase
|
Chris@14
|
21 */
|
Chris@14
|
22 private $testCase;
|
Chris@14
|
23
|
Chris@14
|
24 /**
|
Chris@14
|
25 * @var string
|
Chris@14
|
26 */
|
Chris@14
|
27 private $type;
|
Chris@14
|
28
|
Chris@14
|
29 /**
|
Chris@14
|
30 * @var array
|
Chris@14
|
31 */
|
Chris@14
|
32 private $methods = [];
|
Chris@14
|
33
|
Chris@14
|
34 /**
|
Chris@14
|
35 * @var array
|
Chris@14
|
36 */
|
Chris@14
|
37 private $methodsExcept = [];
|
Chris@14
|
38
|
Chris@14
|
39 /**
|
Chris@14
|
40 * @var string
|
Chris@14
|
41 */
|
Chris@14
|
42 private $mockClassName = '';
|
Chris@14
|
43
|
Chris@14
|
44 /**
|
Chris@14
|
45 * @var array
|
Chris@14
|
46 */
|
Chris@14
|
47 private $constructorArgs = [];
|
Chris@14
|
48
|
Chris@14
|
49 /**
|
Chris@14
|
50 * @var bool
|
Chris@14
|
51 */
|
Chris@14
|
52 private $originalConstructor = true;
|
Chris@14
|
53
|
Chris@14
|
54 /**
|
Chris@14
|
55 * @var bool
|
Chris@14
|
56 */
|
Chris@14
|
57 private $originalClone = true;
|
Chris@14
|
58
|
Chris@14
|
59 /**
|
Chris@14
|
60 * @var bool
|
Chris@14
|
61 */
|
Chris@14
|
62 private $autoload = true;
|
Chris@14
|
63
|
Chris@14
|
64 /**
|
Chris@14
|
65 * @var bool
|
Chris@14
|
66 */
|
Chris@14
|
67 private $cloneArguments = false;
|
Chris@14
|
68
|
Chris@14
|
69 /**
|
Chris@14
|
70 * @var bool
|
Chris@14
|
71 */
|
Chris@14
|
72 private $callOriginalMethods = false;
|
Chris@14
|
73
|
Chris@14
|
74 /**
|
Chris@14
|
75 * @var object
|
Chris@14
|
76 */
|
Chris@14
|
77 private $proxyTarget = null;
|
Chris@14
|
78
|
Chris@14
|
79 /**
|
Chris@14
|
80 * @var bool
|
Chris@14
|
81 */
|
Chris@14
|
82 private $allowMockingUnknownTypes = true;
|
Chris@14
|
83
|
Chris@14
|
84 /**
|
Chris@14
|
85 * @var Generator
|
Chris@14
|
86 */
|
Chris@14
|
87 private $generator;
|
Chris@14
|
88
|
Chris@14
|
89 /**
|
Chris@14
|
90 * @param TestCase $testCase
|
Chris@14
|
91 * @param array|string $type
|
Chris@14
|
92 */
|
Chris@14
|
93 public function __construct(TestCase $testCase, $type)
|
Chris@14
|
94 {
|
Chris@14
|
95 $this->testCase = $testCase;
|
Chris@14
|
96 $this->type = $type;
|
Chris@14
|
97 $this->generator = new Generator;
|
Chris@14
|
98 }
|
Chris@14
|
99
|
Chris@14
|
100 /**
|
Chris@14
|
101 * Creates a mock object using a fluent interface.
|
Chris@14
|
102 *
|
Chris@14
|
103 * @return MockObject
|
Chris@14
|
104 */
|
Chris@14
|
105 public function getMock()
|
Chris@14
|
106 {
|
Chris@14
|
107 $object = $this->generator->getMock(
|
Chris@14
|
108 $this->type,
|
Chris@14
|
109 $this->methods,
|
Chris@14
|
110 $this->constructorArgs,
|
Chris@14
|
111 $this->mockClassName,
|
Chris@14
|
112 $this->originalConstructor,
|
Chris@14
|
113 $this->originalClone,
|
Chris@14
|
114 $this->autoload,
|
Chris@14
|
115 $this->cloneArguments,
|
Chris@14
|
116 $this->callOriginalMethods,
|
Chris@14
|
117 $this->proxyTarget,
|
Chris@14
|
118 $this->allowMockingUnknownTypes
|
Chris@14
|
119 );
|
Chris@14
|
120
|
Chris@14
|
121 $this->testCase->registerMockObject($object);
|
Chris@14
|
122
|
Chris@14
|
123 return $object;
|
Chris@14
|
124 }
|
Chris@14
|
125
|
Chris@14
|
126 /**
|
Chris@14
|
127 * Creates a mock object for an abstract class using a fluent interface.
|
Chris@14
|
128 *
|
Chris@14
|
129 * @return MockObject
|
Chris@14
|
130 */
|
Chris@14
|
131 public function getMockForAbstractClass()
|
Chris@14
|
132 {
|
Chris@14
|
133 $object = $this->generator->getMockForAbstractClass(
|
Chris@14
|
134 $this->type,
|
Chris@14
|
135 $this->constructorArgs,
|
Chris@14
|
136 $this->mockClassName,
|
Chris@14
|
137 $this->originalConstructor,
|
Chris@14
|
138 $this->originalClone,
|
Chris@14
|
139 $this->autoload,
|
Chris@14
|
140 $this->methods,
|
Chris@14
|
141 $this->cloneArguments
|
Chris@14
|
142 );
|
Chris@14
|
143
|
Chris@14
|
144 $this->testCase->registerMockObject($object);
|
Chris@14
|
145
|
Chris@14
|
146 return $object;
|
Chris@14
|
147 }
|
Chris@14
|
148
|
Chris@14
|
149 /**
|
Chris@14
|
150 * Creates a mock object for a trait using a fluent interface.
|
Chris@14
|
151 *
|
Chris@14
|
152 * @return MockObject
|
Chris@14
|
153 */
|
Chris@14
|
154 public function getMockForTrait()
|
Chris@14
|
155 {
|
Chris@14
|
156 $object = $this->generator->getMockForTrait(
|
Chris@14
|
157 $this->type,
|
Chris@14
|
158 $this->constructorArgs,
|
Chris@14
|
159 $this->mockClassName,
|
Chris@14
|
160 $this->originalConstructor,
|
Chris@14
|
161 $this->originalClone,
|
Chris@14
|
162 $this->autoload,
|
Chris@14
|
163 $this->methods,
|
Chris@14
|
164 $this->cloneArguments
|
Chris@14
|
165 );
|
Chris@14
|
166
|
Chris@14
|
167 $this->testCase->registerMockObject($object);
|
Chris@14
|
168
|
Chris@14
|
169 return $object;
|
Chris@14
|
170 }
|
Chris@14
|
171
|
Chris@14
|
172 /**
|
Chris@14
|
173 * Specifies the subset of methods to mock. Default is to mock none of them.
|
Chris@14
|
174 *
|
Chris@14
|
175 * @param array|null $methods
|
Chris@14
|
176 *
|
Chris@14
|
177 * @return MockBuilder
|
Chris@14
|
178 */
|
Chris@14
|
179 public function setMethods(array $methods = null)
|
Chris@14
|
180 {
|
Chris@14
|
181 $this->methods = $methods;
|
Chris@14
|
182
|
Chris@14
|
183 return $this;
|
Chris@14
|
184 }
|
Chris@14
|
185
|
Chris@14
|
186 /**
|
Chris@14
|
187 * Specifies the subset of methods to not mock. Default is to mock all of them.
|
Chris@14
|
188 *
|
Chris@14
|
189 * @param array $methods
|
Chris@14
|
190 *
|
Chris@14
|
191 * @return MockBuilder
|
Chris@14
|
192 */
|
Chris@14
|
193 public function setMethodsExcept(array $methods = [])
|
Chris@14
|
194 {
|
Chris@14
|
195 $this->methodsExcept = $methods;
|
Chris@14
|
196
|
Chris@14
|
197 $this->setMethods(
|
Chris@14
|
198 \array_diff(
|
Chris@14
|
199 $this->generator->getClassMethods($this->type),
|
Chris@14
|
200 $this->methodsExcept
|
Chris@14
|
201 )
|
Chris@14
|
202 );
|
Chris@14
|
203
|
Chris@14
|
204 return $this;
|
Chris@14
|
205 }
|
Chris@14
|
206
|
Chris@14
|
207 /**
|
Chris@14
|
208 * Specifies the arguments for the constructor.
|
Chris@14
|
209 *
|
Chris@14
|
210 * @param array $args
|
Chris@14
|
211 *
|
Chris@14
|
212 * @return MockBuilder
|
Chris@14
|
213 */
|
Chris@14
|
214 public function setConstructorArgs(array $args)
|
Chris@14
|
215 {
|
Chris@14
|
216 $this->constructorArgs = $args;
|
Chris@14
|
217
|
Chris@14
|
218 return $this;
|
Chris@14
|
219 }
|
Chris@14
|
220
|
Chris@14
|
221 /**
|
Chris@14
|
222 * Specifies the name for the mock class.
|
Chris@14
|
223 *
|
Chris@14
|
224 * @param string $name
|
Chris@14
|
225 *
|
Chris@14
|
226 * @return MockBuilder
|
Chris@14
|
227 */
|
Chris@14
|
228 public function setMockClassName($name)
|
Chris@14
|
229 {
|
Chris@14
|
230 $this->mockClassName = $name;
|
Chris@14
|
231
|
Chris@14
|
232 return $this;
|
Chris@14
|
233 }
|
Chris@14
|
234
|
Chris@14
|
235 /**
|
Chris@14
|
236 * Disables the invocation of the original constructor.
|
Chris@14
|
237 *
|
Chris@14
|
238 * @return MockBuilder
|
Chris@14
|
239 */
|
Chris@14
|
240 public function disableOriginalConstructor()
|
Chris@14
|
241 {
|
Chris@14
|
242 $this->originalConstructor = false;
|
Chris@14
|
243
|
Chris@14
|
244 return $this;
|
Chris@14
|
245 }
|
Chris@14
|
246
|
Chris@14
|
247 /**
|
Chris@14
|
248 * Enables the invocation of the original constructor.
|
Chris@14
|
249 *
|
Chris@14
|
250 * @return MockBuilder
|
Chris@14
|
251 */
|
Chris@14
|
252 public function enableOriginalConstructor()
|
Chris@14
|
253 {
|
Chris@14
|
254 $this->originalConstructor = true;
|
Chris@14
|
255
|
Chris@14
|
256 return $this;
|
Chris@14
|
257 }
|
Chris@14
|
258
|
Chris@14
|
259 /**
|
Chris@14
|
260 * Disables the invocation of the original clone constructor.
|
Chris@14
|
261 *
|
Chris@14
|
262 * @return MockBuilder
|
Chris@14
|
263 */
|
Chris@14
|
264 public function disableOriginalClone()
|
Chris@14
|
265 {
|
Chris@14
|
266 $this->originalClone = false;
|
Chris@14
|
267
|
Chris@14
|
268 return $this;
|
Chris@14
|
269 }
|
Chris@14
|
270
|
Chris@14
|
271 /**
|
Chris@14
|
272 * Enables the invocation of the original clone constructor.
|
Chris@14
|
273 *
|
Chris@14
|
274 * @return MockBuilder
|
Chris@14
|
275 */
|
Chris@14
|
276 public function enableOriginalClone()
|
Chris@14
|
277 {
|
Chris@14
|
278 $this->originalClone = true;
|
Chris@14
|
279
|
Chris@14
|
280 return $this;
|
Chris@14
|
281 }
|
Chris@14
|
282
|
Chris@14
|
283 /**
|
Chris@14
|
284 * Disables the use of class autoloading while creating the mock object.
|
Chris@14
|
285 *
|
Chris@14
|
286 * @return MockBuilder
|
Chris@14
|
287 */
|
Chris@14
|
288 public function disableAutoload()
|
Chris@14
|
289 {
|
Chris@14
|
290 $this->autoload = false;
|
Chris@14
|
291
|
Chris@14
|
292 return $this;
|
Chris@14
|
293 }
|
Chris@14
|
294
|
Chris@14
|
295 /**
|
Chris@14
|
296 * Enables the use of class autoloading while creating the mock object.
|
Chris@14
|
297 *
|
Chris@14
|
298 * @return MockBuilder
|
Chris@14
|
299 */
|
Chris@14
|
300 public function enableAutoload()
|
Chris@14
|
301 {
|
Chris@14
|
302 $this->autoload = true;
|
Chris@14
|
303
|
Chris@14
|
304 return $this;
|
Chris@14
|
305 }
|
Chris@14
|
306
|
Chris@14
|
307 /**
|
Chris@14
|
308 * Disables the cloning of arguments passed to mocked methods.
|
Chris@14
|
309 *
|
Chris@14
|
310 * @return MockBuilder
|
Chris@14
|
311 */
|
Chris@14
|
312 public function disableArgumentCloning()
|
Chris@14
|
313 {
|
Chris@14
|
314 $this->cloneArguments = false;
|
Chris@14
|
315
|
Chris@14
|
316 return $this;
|
Chris@14
|
317 }
|
Chris@14
|
318
|
Chris@14
|
319 /**
|
Chris@14
|
320 * Enables the cloning of arguments passed to mocked methods.
|
Chris@14
|
321 *
|
Chris@14
|
322 * @return MockBuilder
|
Chris@14
|
323 */
|
Chris@14
|
324 public function enableArgumentCloning()
|
Chris@14
|
325 {
|
Chris@14
|
326 $this->cloneArguments = true;
|
Chris@14
|
327
|
Chris@14
|
328 return $this;
|
Chris@14
|
329 }
|
Chris@14
|
330
|
Chris@14
|
331 /**
|
Chris@14
|
332 * Enables the invocation of the original methods.
|
Chris@14
|
333 *
|
Chris@14
|
334 * @return MockBuilder
|
Chris@14
|
335 */
|
Chris@14
|
336 public function enableProxyingToOriginalMethods()
|
Chris@14
|
337 {
|
Chris@14
|
338 $this->callOriginalMethods = true;
|
Chris@14
|
339
|
Chris@14
|
340 return $this;
|
Chris@14
|
341 }
|
Chris@14
|
342
|
Chris@14
|
343 /**
|
Chris@14
|
344 * Disables the invocation of the original methods.
|
Chris@14
|
345 *
|
Chris@14
|
346 * @return MockBuilder
|
Chris@14
|
347 */
|
Chris@14
|
348 public function disableProxyingToOriginalMethods()
|
Chris@14
|
349 {
|
Chris@14
|
350 $this->callOriginalMethods = false;
|
Chris@14
|
351 $this->proxyTarget = null;
|
Chris@14
|
352
|
Chris@14
|
353 return $this;
|
Chris@14
|
354 }
|
Chris@14
|
355
|
Chris@14
|
356 /**
|
Chris@14
|
357 * Sets the proxy target.
|
Chris@14
|
358 *
|
Chris@14
|
359 * @param object $object
|
Chris@14
|
360 *
|
Chris@14
|
361 * @return MockBuilder
|
Chris@14
|
362 */
|
Chris@14
|
363 public function setProxyTarget($object)
|
Chris@14
|
364 {
|
Chris@14
|
365 $this->proxyTarget = $object;
|
Chris@14
|
366
|
Chris@14
|
367 return $this;
|
Chris@14
|
368 }
|
Chris@14
|
369
|
Chris@14
|
370 /**
|
Chris@14
|
371 * @return MockBuilder
|
Chris@14
|
372 */
|
Chris@14
|
373 public function allowMockingUnknownTypes()
|
Chris@14
|
374 {
|
Chris@14
|
375 $this->allowMockingUnknownTypes = true;
|
Chris@14
|
376
|
Chris@14
|
377 return $this;
|
Chris@14
|
378 }
|
Chris@14
|
379
|
Chris@14
|
380 /**
|
Chris@14
|
381 * @return MockBuilder
|
Chris@14
|
382 */
|
Chris@14
|
383 public function disallowMockingUnknownTypes()
|
Chris@14
|
384 {
|
Chris@14
|
385 $this->allowMockingUnknownTypes = false;
|
Chris@14
|
386
|
Chris@14
|
387 return $this;
|
Chris@14
|
388 }
|
Chris@14
|
389 }
|