Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@14
|
3 * This file is part of the phpunit-mock-objects package.
|
Chris@0
|
4 *
|
Chris@0
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@0
|
6 *
|
Chris@0
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
8 * file that was distributed with this source code.
|
Chris@0
|
9 */
|
Chris@0
|
10
|
Chris@14
|
11 use PHPUnit\Framework\MockObject\MockObject;
|
Chris@14
|
12 use PHPUnit\Framework\TestCase;
|
Chris@14
|
13 use PHPUnit\Framework\ExpectationFailedException;
|
Chris@14
|
14
|
Chris@14
|
15 class MockObjectTest extends TestCase
|
Chris@0
|
16 {
|
Chris@0
|
17 public function testMockedMethodIsNeverCalled()
|
Chris@0
|
18 {
|
Chris@14
|
19 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
20 ->getMock();
|
Chris@14
|
21
|
Chris@0
|
22 $mock->expects($this->never())
|
Chris@0
|
23 ->method('doSomething');
|
Chris@0
|
24 }
|
Chris@0
|
25
|
Chris@0
|
26 public function testMockedMethodIsNeverCalledWithParameter()
|
Chris@0
|
27 {
|
Chris@14
|
28 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
29 ->getMock();
|
Chris@14
|
30
|
Chris@0
|
31 $mock->expects($this->never())
|
Chris@14
|
32 ->method('doSomething')
|
Chris@14
|
33 ->with('someArg');
|
Chris@0
|
34 }
|
Chris@0
|
35
|
Chris@14
|
36 /**
|
Chris@14
|
37 * @doesNotPerformAssertions
|
Chris@14
|
38 */
|
Chris@0
|
39 public function testMockedMethodIsNotCalledWhenExpectsAnyWithParameter()
|
Chris@0
|
40 {
|
Chris@14
|
41 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
42 ->getMock();
|
Chris@14
|
43
|
Chris@0
|
44 $mock->expects($this->any())
|
Chris@0
|
45 ->method('doSomethingElse')
|
Chris@0
|
46 ->with('someArg');
|
Chris@0
|
47 }
|
Chris@0
|
48
|
Chris@14
|
49 /**
|
Chris@14
|
50 * @doesNotPerformAssertions
|
Chris@14
|
51 */
|
Chris@0
|
52 public function testMockedMethodIsNotCalledWhenMethodSpecifiedDirectlyWithParameter()
|
Chris@0
|
53 {
|
Chris@14
|
54 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
55 ->getMock();
|
Chris@14
|
56
|
Chris@0
|
57 $mock->method('doSomethingElse')
|
Chris@14
|
58 ->with('someArg');
|
Chris@0
|
59 }
|
Chris@0
|
60
|
Chris@0
|
61 public function testMockedMethodIsCalledAtLeastOnce()
|
Chris@0
|
62 {
|
Chris@14
|
63 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
64 ->getMock();
|
Chris@14
|
65
|
Chris@0
|
66 $mock->expects($this->atLeastOnce())
|
Chris@0
|
67 ->method('doSomething');
|
Chris@0
|
68
|
Chris@0
|
69 $mock->doSomething();
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@0
|
72 public function testMockedMethodIsCalledAtLeastOnce2()
|
Chris@0
|
73 {
|
Chris@14
|
74 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
75 ->getMock();
|
Chris@14
|
76
|
Chris@0
|
77 $mock->expects($this->atLeastOnce())
|
Chris@0
|
78 ->method('doSomething');
|
Chris@0
|
79
|
Chris@0
|
80 $mock->doSomething();
|
Chris@0
|
81 $mock->doSomething();
|
Chris@0
|
82 }
|
Chris@0
|
83
|
Chris@0
|
84 public function testMockedMethodIsCalledAtLeastTwice()
|
Chris@0
|
85 {
|
Chris@14
|
86 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
87 ->getMock();
|
Chris@14
|
88
|
Chris@0
|
89 $mock->expects($this->atLeast(2))
|
Chris@0
|
90 ->method('doSomething');
|
Chris@0
|
91
|
Chris@0
|
92 $mock->doSomething();
|
Chris@0
|
93 $mock->doSomething();
|
Chris@0
|
94 }
|
Chris@0
|
95
|
Chris@0
|
96 public function testMockedMethodIsCalledAtLeastTwice2()
|
Chris@0
|
97 {
|
Chris@14
|
98 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
99 ->getMock();
|
Chris@14
|
100
|
Chris@0
|
101 $mock->expects($this->atLeast(2))
|
Chris@0
|
102 ->method('doSomething');
|
Chris@0
|
103
|
Chris@0
|
104 $mock->doSomething();
|
Chris@0
|
105 $mock->doSomething();
|
Chris@0
|
106 $mock->doSomething();
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 public function testMockedMethodIsCalledAtMostTwice()
|
Chris@0
|
110 {
|
Chris@14
|
111 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
112 ->getMock();
|
Chris@14
|
113
|
Chris@0
|
114 $mock->expects($this->atMost(2))
|
Chris@0
|
115 ->method('doSomething');
|
Chris@0
|
116
|
Chris@0
|
117 $mock->doSomething();
|
Chris@0
|
118 $mock->doSomething();
|
Chris@0
|
119 }
|
Chris@0
|
120
|
Chris@0
|
121 public function testMockedMethodIsCalledAtMosttTwice2()
|
Chris@0
|
122 {
|
Chris@14
|
123 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
124 ->getMock();
|
Chris@14
|
125
|
Chris@0
|
126 $mock->expects($this->atMost(2))
|
Chris@0
|
127 ->method('doSomething');
|
Chris@0
|
128
|
Chris@0
|
129 $mock->doSomething();
|
Chris@0
|
130 }
|
Chris@0
|
131
|
Chris@0
|
132 public function testMockedMethodIsCalledOnce()
|
Chris@0
|
133 {
|
Chris@14
|
134 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
135 ->getMock();
|
Chris@14
|
136
|
Chris@0
|
137 $mock->expects($this->once())
|
Chris@0
|
138 ->method('doSomething');
|
Chris@0
|
139
|
Chris@0
|
140 $mock->doSomething();
|
Chris@0
|
141 }
|
Chris@0
|
142
|
Chris@0
|
143 public function testMockedMethodIsCalledOnceWithParameter()
|
Chris@0
|
144 {
|
Chris@14
|
145 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
146 ->getMock();
|
Chris@14
|
147
|
Chris@0
|
148 $mock->expects($this->once())
|
Chris@0
|
149 ->method('doSomethingElse')
|
Chris@0
|
150 ->with($this->equalTo('something'));
|
Chris@0
|
151
|
Chris@0
|
152 $mock->doSomethingElse('something');
|
Chris@0
|
153 }
|
Chris@0
|
154
|
Chris@0
|
155 public function testMockedMethodIsCalledExactly()
|
Chris@0
|
156 {
|
Chris@14
|
157 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
158 ->getMock();
|
Chris@14
|
159
|
Chris@0
|
160 $mock->expects($this->exactly(2))
|
Chris@0
|
161 ->method('doSomething');
|
Chris@0
|
162
|
Chris@0
|
163 $mock->doSomething();
|
Chris@0
|
164 $mock->doSomething();
|
Chris@0
|
165 }
|
Chris@0
|
166
|
Chris@0
|
167 public function testStubbedException()
|
Chris@0
|
168 {
|
Chris@14
|
169 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
170 ->getMock();
|
Chris@14
|
171
|
Chris@0
|
172 $mock->expects($this->any())
|
Chris@0
|
173 ->method('doSomething')
|
Chris@14
|
174 ->will($this->throwException(new \Exception()));
|
Chris@0
|
175
|
Chris@14
|
176 $this->expectException(\Exception::class);
|
Chris@0
|
177
|
Chris@14
|
178 $mock->doSomething();
|
Chris@0
|
179 }
|
Chris@0
|
180
|
Chris@0
|
181 public function testStubbedWillThrowException()
|
Chris@0
|
182 {
|
Chris@14
|
183 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
184 ->getMock();
|
Chris@14
|
185
|
Chris@0
|
186 $mock->expects($this->any())
|
Chris@0
|
187 ->method('doSomething')
|
Chris@14
|
188 ->willThrowException(new \Exception());
|
Chris@0
|
189
|
Chris@14
|
190 $this->expectException(\Exception::class);
|
Chris@0
|
191
|
Chris@14
|
192 $mock->doSomething();
|
Chris@0
|
193 }
|
Chris@0
|
194
|
Chris@0
|
195 public function testStubbedReturnValue()
|
Chris@0
|
196 {
|
Chris@14
|
197 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
198 ->getMock();
|
Chris@14
|
199
|
Chris@0
|
200 $mock->expects($this->any())
|
Chris@0
|
201 ->method('doSomething')
|
Chris@0
|
202 ->will($this->returnValue('something'));
|
Chris@0
|
203
|
Chris@0
|
204 $this->assertEquals('something', $mock->doSomething());
|
Chris@0
|
205
|
Chris@14
|
206 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
207 ->getMock();
|
Chris@14
|
208
|
Chris@0
|
209 $mock->expects($this->any())
|
Chris@0
|
210 ->method('doSomething')
|
Chris@0
|
211 ->willReturn('something');
|
Chris@0
|
212
|
Chris@0
|
213 $this->assertEquals('something', $mock->doSomething());
|
Chris@0
|
214 }
|
Chris@0
|
215
|
Chris@0
|
216 public function testStubbedReturnValueMap()
|
Chris@0
|
217 {
|
Chris@14
|
218 $map = [
|
Chris@14
|
219 ['a', 'b', 'c', 'd'],
|
Chris@14
|
220 ['e', 'f', 'g', 'h']
|
Chris@14
|
221 ];
|
Chris@0
|
222
|
Chris@14
|
223 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
224 ->getMock();
|
Chris@14
|
225
|
Chris@0
|
226 $mock->expects($this->any())
|
Chris@0
|
227 ->method('doSomething')
|
Chris@0
|
228 ->will($this->returnValueMap($map));
|
Chris@0
|
229
|
Chris@0
|
230 $this->assertEquals('d', $mock->doSomething('a', 'b', 'c'));
|
Chris@0
|
231 $this->assertEquals('h', $mock->doSomething('e', 'f', 'g'));
|
Chris@0
|
232 $this->assertEquals(null, $mock->doSomething('foo', 'bar'));
|
Chris@0
|
233
|
Chris@14
|
234 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
235 ->getMock();
|
Chris@14
|
236
|
Chris@0
|
237 $mock->expects($this->any())
|
Chris@0
|
238 ->method('doSomething')
|
Chris@0
|
239 ->willReturnMap($map);
|
Chris@0
|
240
|
Chris@0
|
241 $this->assertEquals('d', $mock->doSomething('a', 'b', 'c'));
|
Chris@0
|
242 $this->assertEquals('h', $mock->doSomething('e', 'f', 'g'));
|
Chris@0
|
243 $this->assertEquals(null, $mock->doSomething('foo', 'bar'));
|
Chris@0
|
244 }
|
Chris@0
|
245
|
Chris@0
|
246 public function testStubbedReturnArgument()
|
Chris@0
|
247 {
|
Chris@14
|
248 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
249 ->getMock();
|
Chris@14
|
250
|
Chris@0
|
251 $mock->expects($this->any())
|
Chris@0
|
252 ->method('doSomething')
|
Chris@0
|
253 ->will($this->returnArgument(1));
|
Chris@0
|
254
|
Chris@0
|
255 $this->assertEquals('b', $mock->doSomething('a', 'b'));
|
Chris@0
|
256
|
Chris@14
|
257 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
258 ->getMock();
|
Chris@14
|
259
|
Chris@0
|
260 $mock->expects($this->any())
|
Chris@0
|
261 ->method('doSomething')
|
Chris@0
|
262 ->willReturnArgument(1);
|
Chris@0
|
263
|
Chris@0
|
264 $this->assertEquals('b', $mock->doSomething('a', 'b'));
|
Chris@0
|
265 }
|
Chris@0
|
266
|
Chris@0
|
267 public function testFunctionCallback()
|
Chris@0
|
268 {
|
Chris@14
|
269 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
270 ->setMethods(['doSomething'])
|
Chris@14
|
271 ->getMock();
|
Chris@14
|
272
|
Chris@0
|
273 $mock->expects($this->once())
|
Chris@0
|
274 ->method('doSomething')
|
Chris@0
|
275 ->will($this->returnCallback('functionCallback'));
|
Chris@0
|
276
|
Chris@0
|
277 $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
|
Chris@0
|
278
|
Chris@14
|
279 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
280 ->setMethods(['doSomething'])
|
Chris@14
|
281 ->getMock();
|
Chris@14
|
282
|
Chris@0
|
283 $mock->expects($this->once())
|
Chris@0
|
284 ->method('doSomething')
|
Chris@0
|
285 ->willReturnCallback('functionCallback');
|
Chris@0
|
286
|
Chris@0
|
287 $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
|
Chris@0
|
288 }
|
Chris@0
|
289
|
Chris@0
|
290 public function testStubbedReturnSelf()
|
Chris@0
|
291 {
|
Chris@14
|
292 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
293 ->getMock();
|
Chris@14
|
294
|
Chris@0
|
295 $mock->expects($this->any())
|
Chris@0
|
296 ->method('doSomething')
|
Chris@0
|
297 ->will($this->returnSelf());
|
Chris@0
|
298
|
Chris@0
|
299 $this->assertEquals($mock, $mock->doSomething());
|
Chris@0
|
300
|
Chris@14
|
301 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
302 ->getMock();
|
Chris@14
|
303
|
Chris@0
|
304 $mock->expects($this->any())
|
Chris@0
|
305 ->method('doSomething')
|
Chris@0
|
306 ->willReturnSelf();
|
Chris@0
|
307
|
Chris@0
|
308 $this->assertEquals($mock, $mock->doSomething());
|
Chris@0
|
309 }
|
Chris@0
|
310
|
Chris@0
|
311 public function testStubbedReturnOnConsecutiveCalls()
|
Chris@0
|
312 {
|
Chris@14
|
313 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
314 ->getMock();
|
Chris@14
|
315
|
Chris@0
|
316 $mock->expects($this->any())
|
Chris@0
|
317 ->method('doSomething')
|
Chris@0
|
318 ->will($this->onConsecutiveCalls('a', 'b', 'c'));
|
Chris@0
|
319
|
Chris@0
|
320 $this->assertEquals('a', $mock->doSomething());
|
Chris@0
|
321 $this->assertEquals('b', $mock->doSomething());
|
Chris@0
|
322 $this->assertEquals('c', $mock->doSomething());
|
Chris@0
|
323
|
Chris@14
|
324 $mock = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
325 ->getMock();
|
Chris@14
|
326
|
Chris@0
|
327 $mock->expects($this->any())
|
Chris@0
|
328 ->method('doSomething')
|
Chris@0
|
329 ->willReturnOnConsecutiveCalls('a', 'b', 'c');
|
Chris@0
|
330
|
Chris@0
|
331 $this->assertEquals('a', $mock->doSomething());
|
Chris@0
|
332 $this->assertEquals('b', $mock->doSomething());
|
Chris@0
|
333 $this->assertEquals('c', $mock->doSomething());
|
Chris@0
|
334 }
|
Chris@0
|
335
|
Chris@0
|
336 public function testStaticMethodCallback()
|
Chris@0
|
337 {
|
Chris@14
|
338 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
339 ->setMethods(['doSomething'])
|
Chris@14
|
340 ->getMock();
|
Chris@14
|
341
|
Chris@0
|
342 $mock->expects($this->once())
|
Chris@0
|
343 ->method('doSomething')
|
Chris@14
|
344 ->will($this->returnCallback(['MethodCallback', 'staticCallback']));
|
Chris@0
|
345
|
Chris@0
|
346 $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
|
Chris@0
|
347 }
|
Chris@0
|
348
|
Chris@0
|
349 public function testPublicMethodCallback()
|
Chris@0
|
350 {
|
Chris@14
|
351 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
352 ->setMethods(['doSomething'])
|
Chris@14
|
353 ->getMock();
|
Chris@14
|
354
|
Chris@0
|
355 $mock->expects($this->once())
|
Chris@0
|
356 ->method('doSomething')
|
Chris@14
|
357 ->will($this->returnCallback([new MethodCallback, 'nonStaticCallback']));
|
Chris@0
|
358
|
Chris@0
|
359 $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
|
Chris@0
|
360 }
|
Chris@0
|
361
|
Chris@0
|
362 public function testMockClassOnlyGeneratedOnce()
|
Chris@0
|
363 {
|
Chris@14
|
364 $mock1 = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
365 ->getMock();
|
Chris@14
|
366
|
Chris@14
|
367 $mock2 = $this->getMockBuilder(AnInterface::class)
|
Chris@14
|
368 ->getMock();
|
Chris@0
|
369
|
Chris@0
|
370 $this->assertEquals(get_class($mock1), get_class($mock2));
|
Chris@0
|
371 }
|
Chris@0
|
372
|
Chris@0
|
373 public function testMockClassDifferentForPartialMocks()
|
Chris@0
|
374 {
|
Chris@14
|
375 $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
376 ->getMock();
|
Chris@14
|
377
|
Chris@14
|
378 $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
379 ->setMethods(['doSomething'])
|
Chris@14
|
380 ->getMock();
|
Chris@14
|
381
|
Chris@14
|
382 $mock3 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
383 ->setMethods(['doSomething'])
|
Chris@14
|
384 ->getMock();
|
Chris@14
|
385
|
Chris@14
|
386 $mock4 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
387 ->setMethods(['doAnotherThing'])
|
Chris@14
|
388 ->getMock();
|
Chris@14
|
389
|
Chris@14
|
390 $mock5 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
391 ->setMethods(['doAnotherThing'])
|
Chris@14
|
392 ->getMock();
|
Chris@0
|
393
|
Chris@0
|
394 $this->assertNotEquals(get_class($mock1), get_class($mock2));
|
Chris@0
|
395 $this->assertNotEquals(get_class($mock1), get_class($mock3));
|
Chris@0
|
396 $this->assertNotEquals(get_class($mock1), get_class($mock4));
|
Chris@0
|
397 $this->assertNotEquals(get_class($mock1), get_class($mock5));
|
Chris@0
|
398 $this->assertEquals(get_class($mock2), get_class($mock3));
|
Chris@0
|
399 $this->assertNotEquals(get_class($mock2), get_class($mock4));
|
Chris@0
|
400 $this->assertNotEquals(get_class($mock2), get_class($mock5));
|
Chris@0
|
401 $this->assertEquals(get_class($mock4), get_class($mock5));
|
Chris@0
|
402 }
|
Chris@0
|
403
|
Chris@0
|
404 public function testMockClassStoreOverrulable()
|
Chris@0
|
405 {
|
Chris@14
|
406 $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
407 ->getMock();
|
Chris@14
|
408
|
Chris@14
|
409 $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
410 ->setMockClassName('MyMockClassNameForPartialMockTestClass1')
|
Chris@14
|
411 ->getMock();
|
Chris@14
|
412
|
Chris@14
|
413 $mock3 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
414 ->getMock();
|
Chris@14
|
415
|
Chris@14
|
416 $mock4 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
417 ->setMethods(['doSomething'])
|
Chris@14
|
418 ->setMockClassName('AnotherMockClassNameForPartialMockTestClass')
|
Chris@14
|
419 ->getMock();
|
Chris@14
|
420
|
Chris@14
|
421 $mock5 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
422 ->setMockClassName('MyMockClassNameForPartialMockTestClass2')
|
Chris@14
|
423 ->getMock();
|
Chris@0
|
424
|
Chris@0
|
425 $this->assertNotEquals(get_class($mock1), get_class($mock2));
|
Chris@0
|
426 $this->assertEquals(get_class($mock1), get_class($mock3));
|
Chris@0
|
427 $this->assertNotEquals(get_class($mock1), get_class($mock4));
|
Chris@0
|
428 $this->assertNotEquals(get_class($mock2), get_class($mock3));
|
Chris@0
|
429 $this->assertNotEquals(get_class($mock2), get_class($mock4));
|
Chris@0
|
430 $this->assertNotEquals(get_class($mock2), get_class($mock5));
|
Chris@0
|
431 $this->assertNotEquals(get_class($mock3), get_class($mock4));
|
Chris@0
|
432 $this->assertNotEquals(get_class($mock3), get_class($mock5));
|
Chris@0
|
433 $this->assertNotEquals(get_class($mock4), get_class($mock5));
|
Chris@0
|
434 }
|
Chris@0
|
435
|
Chris@0
|
436 public function testGetMockWithFixedClassNameCanProduceTheSameMockTwice()
|
Chris@0
|
437 {
|
Chris@14
|
438 $mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
|
Chris@14
|
439 $mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
|
Chris@14
|
440 $this->assertInstanceOf(stdClass::class, $mock);
|
Chris@0
|
441 }
|
Chris@0
|
442
|
Chris@0
|
443 public function testOriginalConstructorSettingConsidered()
|
Chris@0
|
444 {
|
Chris@14
|
445 $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
446 ->getMock();
|
Chris@14
|
447
|
Chris@14
|
448 $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
449 ->disableOriginalConstructor()
|
Chris@14
|
450 ->getMock();
|
Chris@0
|
451
|
Chris@0
|
452 $this->assertTrue($mock1->constructorCalled);
|
Chris@0
|
453 $this->assertFalse($mock2->constructorCalled);
|
Chris@0
|
454 }
|
Chris@0
|
455
|
Chris@0
|
456 public function testOriginalCloneSettingConsidered()
|
Chris@0
|
457 {
|
Chris@14
|
458 $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
459 ->getMock();
|
Chris@14
|
460
|
Chris@14
|
461 $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
|
Chris@14
|
462 ->disableOriginalClone()
|
Chris@14
|
463 ->getMock();
|
Chris@0
|
464
|
Chris@0
|
465 $this->assertNotEquals(get_class($mock1), get_class($mock2));
|
Chris@0
|
466 }
|
Chris@0
|
467
|
Chris@0
|
468 public function testGetMockForAbstractClass()
|
Chris@0
|
469 {
|
Chris@14
|
470 $mock = $this->getMockBuilder(AbstractMockTestClass::class)
|
Chris@14
|
471 ->getMock();
|
Chris@14
|
472
|
Chris@0
|
473 $mock->expects($this->never())
|
Chris@0
|
474 ->method('doSomething');
|
Chris@0
|
475 }
|
Chris@0
|
476
|
Chris@0
|
477 /**
|
Chris@0
|
478 * @dataProvider traversableProvider
|
Chris@0
|
479 */
|
Chris@0
|
480 public function testGetMockForTraversable($type)
|
Chris@0
|
481 {
|
Chris@14
|
482 $mock = $this->getMockBuilder($type)
|
Chris@14
|
483 ->getMock();
|
Chris@14
|
484
|
Chris@14
|
485 $this->assertInstanceOf(Traversable::class, $mock);
|
Chris@0
|
486 }
|
Chris@0
|
487
|
Chris@0
|
488 public function testMultipleInterfacesCanBeMockedInSingleObject()
|
Chris@0
|
489 {
|
Chris@14
|
490 $mock = $this->getMockBuilder([AnInterface::class, AnotherInterface::class])
|
Chris@14
|
491 ->getMock();
|
Chris@14
|
492
|
Chris@14
|
493 $this->assertInstanceOf(AnInterface::class, $mock);
|
Chris@14
|
494 $this->assertInstanceOf(AnotherInterface::class, $mock);
|
Chris@0
|
495 }
|
Chris@0
|
496
|
Chris@0
|
497 public function testGetMockForTrait()
|
Chris@0
|
498 {
|
Chris@14
|
499 $mock = $this->getMockForTrait(AbstractTrait::class);
|
Chris@14
|
500
|
Chris@14
|
501 $mock->expects($this->never())
|
Chris@14
|
502 ->method('doSomething');
|
Chris@0
|
503
|
Chris@0
|
504 $parent = get_parent_class($mock);
|
Chris@0
|
505 $traits = class_uses($parent, false);
|
Chris@0
|
506
|
Chris@14
|
507 $this->assertContains(AbstractTrait::class, $traits);
|
Chris@0
|
508 }
|
Chris@0
|
509
|
Chris@0
|
510 public function testClonedMockObjectShouldStillEqualTheOriginal()
|
Chris@0
|
511 {
|
Chris@14
|
512 $a = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
513 ->getMock();
|
Chris@14
|
514
|
Chris@0
|
515 $b = clone $a;
|
Chris@14
|
516
|
Chris@0
|
517 $this->assertEquals($a, $b);
|
Chris@0
|
518 }
|
Chris@0
|
519
|
Chris@0
|
520 public function testMockObjectsConstructedIndepentantlyShouldBeEqual()
|
Chris@0
|
521 {
|
Chris@14
|
522 $a = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
523 ->getMock();
|
Chris@14
|
524
|
Chris@14
|
525 $b = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
526 ->getMock();
|
Chris@14
|
527
|
Chris@0
|
528 $this->assertEquals($a, $b);
|
Chris@0
|
529 }
|
Chris@0
|
530
|
Chris@0
|
531 public function testMockObjectsConstructedIndepentantlyShouldNotBeTheSame()
|
Chris@0
|
532 {
|
Chris@14
|
533 $a = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
534 ->getMock();
|
Chris@14
|
535
|
Chris@14
|
536 $b = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
537 ->getMock();
|
Chris@14
|
538
|
Chris@0
|
539 $this->assertNotSame($a, $b);
|
Chris@0
|
540 }
|
Chris@0
|
541
|
Chris@0
|
542 public function testClonedMockObjectCanBeUsedInPlaceOfOriginalOne()
|
Chris@0
|
543 {
|
Chris@14
|
544 $x = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
545 ->getMock();
|
Chris@14
|
546
|
Chris@0
|
547 $y = clone $x;
|
Chris@0
|
548
|
Chris@14
|
549 $mock = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
550 ->setMethods(['foo'])
|
Chris@14
|
551 ->getMock();
|
Chris@14
|
552
|
Chris@14
|
553 $mock->expects($this->once())
|
Chris@14
|
554 ->method('foo')
|
Chris@14
|
555 ->with($this->equalTo($x));
|
Chris@14
|
556
|
Chris@0
|
557 $mock->foo($y);
|
Chris@0
|
558 }
|
Chris@0
|
559
|
Chris@0
|
560 public function testClonedMockObjectIsNotIdenticalToOriginalOne()
|
Chris@0
|
561 {
|
Chris@14
|
562 $x = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
563 ->getMock();
|
Chris@14
|
564
|
Chris@0
|
565 $y = clone $x;
|
Chris@0
|
566
|
Chris@14
|
567 $mock = $this->getMockBuilder(stdClass::class)
|
Chris@14
|
568 ->setMethods(['foo'])
|
Chris@14
|
569 ->getMock();
|
Chris@14
|
570
|
Chris@14
|
571 $mock->expects($this->once())
|
Chris@14
|
572 ->method('foo')
|
Chris@14
|
573 ->with($this->logicalNot($this->identicalTo($x)));
|
Chris@14
|
574
|
Chris@0
|
575 $mock->foo($y);
|
Chris@0
|
576 }
|
Chris@0
|
577
|
Chris@0
|
578 public function testObjectMethodCallWithArgumentCloningEnabled()
|
Chris@0
|
579 {
|
Chris@14
|
580 $expectedObject = new stdClass;
|
Chris@0
|
581
|
Chris@0
|
582 $mock = $this->getMockBuilder('SomeClass')
|
Chris@14
|
583 ->setMethods(['doSomethingElse'])
|
Chris@0
|
584 ->enableArgumentCloning()
|
Chris@0
|
585 ->getMock();
|
Chris@0
|
586
|
Chris@14
|
587 $actualArguments = [];
|
Chris@0
|
588
|
Chris@0
|
589 $mock->expects($this->any())
|
Chris@14
|
590 ->method('doSomethingElse')
|
Chris@14
|
591 ->will(
|
Chris@14
|
592 $this->returnCallback(
|
Chris@14
|
593 function () use (&$actualArguments) {
|
Chris@14
|
594 $actualArguments = func_get_args();
|
Chris@14
|
595 }
|
Chris@14
|
596 )
|
Chris@14
|
597 );
|
Chris@0
|
598
|
Chris@0
|
599 $mock->doSomethingElse($expectedObject);
|
Chris@0
|
600
|
Chris@0
|
601 $this->assertEquals(1, count($actualArguments));
|
Chris@0
|
602 $this->assertEquals($expectedObject, $actualArguments[0]);
|
Chris@0
|
603 $this->assertNotSame($expectedObject, $actualArguments[0]);
|
Chris@0
|
604 }
|
Chris@0
|
605
|
Chris@0
|
606 public function testObjectMethodCallWithArgumentCloningDisabled()
|
Chris@0
|
607 {
|
Chris@14
|
608 $expectedObject = new stdClass;
|
Chris@0
|
609
|
Chris@0
|
610 $mock = $this->getMockBuilder('SomeClass')
|
Chris@14
|
611 ->setMethods(['doSomethingElse'])
|
Chris@0
|
612 ->disableArgumentCloning()
|
Chris@0
|
613 ->getMock();
|
Chris@0
|
614
|
Chris@14
|
615 $actualArguments = [];
|
Chris@0
|
616
|
Chris@0
|
617 $mock->expects($this->any())
|
Chris@14
|
618 ->method('doSomethingElse')
|
Chris@14
|
619 ->will(
|
Chris@14
|
620 $this->returnCallback(
|
Chris@14
|
621 function () use (&$actualArguments) {
|
Chris@14
|
622 $actualArguments = func_get_args();
|
Chris@14
|
623 }
|
Chris@14
|
624 )
|
Chris@14
|
625 );
|
Chris@0
|
626
|
Chris@0
|
627 $mock->doSomethingElse($expectedObject);
|
Chris@0
|
628
|
Chris@0
|
629 $this->assertEquals(1, count($actualArguments));
|
Chris@0
|
630 $this->assertSame($expectedObject, $actualArguments[0]);
|
Chris@0
|
631 }
|
Chris@0
|
632
|
Chris@0
|
633 public function testArgumentCloningOptionGeneratesUniqueMock()
|
Chris@0
|
634 {
|
Chris@0
|
635 $mockWithCloning = $this->getMockBuilder('SomeClass')
|
Chris@14
|
636 ->setMethods(['doSomethingElse'])
|
Chris@0
|
637 ->enableArgumentCloning()
|
Chris@0
|
638 ->getMock();
|
Chris@0
|
639
|
Chris@0
|
640 $mockWithoutCloning = $this->getMockBuilder('SomeClass')
|
Chris@14
|
641 ->setMethods(['doSomethingElse'])
|
Chris@0
|
642 ->disableArgumentCloning()
|
Chris@0
|
643 ->getMock();
|
Chris@0
|
644
|
Chris@0
|
645 $this->assertNotEquals($mockWithCloning, $mockWithoutCloning);
|
Chris@0
|
646 }
|
Chris@0
|
647
|
Chris@0
|
648 public function testVerificationOfMethodNameFailsWithoutParameters()
|
Chris@0
|
649 {
|
Chris@14
|
650 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
651 ->setMethods(['right', 'wrong'])
|
Chris@14
|
652 ->getMock();
|
Chris@14
|
653
|
Chris@0
|
654 $mock->expects($this->once())
|
Chris@0
|
655 ->method('right');
|
Chris@0
|
656
|
Chris@0
|
657 $mock->wrong();
|
Chris@14
|
658
|
Chris@0
|
659 try {
|
Chris@0
|
660 $mock->__phpunit_verify();
|
Chris@0
|
661 $this->fail('Expected exception');
|
Chris@14
|
662 } catch (ExpectationFailedException $e) {
|
Chris@0
|
663 $this->assertSame(
|
Chris@14
|
664 'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
|
Chris@14
|
665 'Method was expected to be called 1 times, actually called 0 times.' . PHP_EOL,
|
Chris@0
|
666 $e->getMessage()
|
Chris@0
|
667 );
|
Chris@0
|
668 }
|
Chris@0
|
669
|
Chris@0
|
670 $this->resetMockObjects();
|
Chris@0
|
671 }
|
Chris@0
|
672
|
Chris@0
|
673 public function testVerificationOfMethodNameFailsWithParameters()
|
Chris@0
|
674 {
|
Chris@14
|
675 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
676 ->setMethods(['right', 'wrong'])
|
Chris@14
|
677 ->getMock();
|
Chris@14
|
678
|
Chris@0
|
679 $mock->expects($this->once())
|
Chris@0
|
680 ->method('right');
|
Chris@0
|
681
|
Chris@0
|
682 $mock->wrong();
|
Chris@14
|
683
|
Chris@0
|
684 try {
|
Chris@0
|
685 $mock->__phpunit_verify();
|
Chris@0
|
686 $this->fail('Expected exception');
|
Chris@14
|
687 } catch (ExpectationFailedException $e) {
|
Chris@0
|
688 $this->assertSame(
|
Chris@14
|
689 'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
|
Chris@14
|
690 'Method was expected to be called 1 times, actually called 0 times.' . PHP_EOL,
|
Chris@0
|
691 $e->getMessage()
|
Chris@0
|
692 );
|
Chris@0
|
693 }
|
Chris@0
|
694
|
Chris@0
|
695 $this->resetMockObjects();
|
Chris@0
|
696 }
|
Chris@0
|
697
|
Chris@0
|
698 public function testVerificationOfMethodNameFailsWithWrongParameters()
|
Chris@0
|
699 {
|
Chris@14
|
700 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
701 ->setMethods(['right', 'wrong'])
|
Chris@14
|
702 ->getMock();
|
Chris@14
|
703
|
Chris@0
|
704 $mock->expects($this->once())
|
Chris@0
|
705 ->method('right')
|
Chris@14
|
706 ->with(['first', 'second']);
|
Chris@0
|
707
|
Chris@0
|
708 try {
|
Chris@14
|
709 $mock->right(['second']);
|
Chris@14
|
710 } catch (ExpectationFailedException $e) {
|
Chris@0
|
711 $this->assertSame(
|
Chris@14
|
712 'Expectation failed for method name is equal to "right" when invoked 1 time(s)' . PHP_EOL .
|
Chris@14
|
713 'Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.' . PHP_EOL .
|
Chris@14
|
714 'Failed asserting that two arrays are equal.',
|
Chris@0
|
715 $e->getMessage()
|
Chris@0
|
716 );
|
Chris@0
|
717 }
|
Chris@0
|
718
|
Chris@0
|
719 try {
|
Chris@0
|
720 $mock->__phpunit_verify();
|
Chris@14
|
721
|
Chris@14
|
722 // CHECKOUT THIS MORE CAREFULLY
|
Chris@14
|
723 // $this->fail('Expected exception');
|
Chris@14
|
724
|
Chris@14
|
725 } catch (ExpectationFailedException $e) {
|
Chris@0
|
726 $this->assertSame(
|
Chris@14
|
727 'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
|
Chris@14
|
728 'Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.' . PHP_EOL .
|
Chris@14
|
729 'Failed asserting that two arrays are equal.' . PHP_EOL .
|
Chris@14
|
730 '--- Expected' . PHP_EOL .
|
Chris@14
|
731 '+++ Actual' . PHP_EOL .
|
Chris@14
|
732 '@@ @@' . PHP_EOL .
|
Chris@14
|
733 ' Array (' . PHP_EOL .
|
Chris@14
|
734 '- 0 => \'first\'' . PHP_EOL .
|
Chris@14
|
735 '- 1 => \'second\'' . PHP_EOL .
|
Chris@14
|
736 '+ 0 => \'second\'' . PHP_EOL,
|
Chris@0
|
737 $e->getMessage()
|
Chris@0
|
738 );
|
Chris@0
|
739 }
|
Chris@0
|
740
|
Chris@0
|
741 $this->resetMockObjects();
|
Chris@0
|
742 }
|
Chris@0
|
743
|
Chris@0
|
744 public function testVerificationOfNeverFailsWithEmptyParameters()
|
Chris@0
|
745 {
|
Chris@14
|
746 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
747 ->setMethods(['right', 'wrong'])
|
Chris@14
|
748 ->getMock();
|
Chris@14
|
749
|
Chris@0
|
750 $mock->expects($this->never())
|
Chris@0
|
751 ->method('right')
|
Chris@0
|
752 ->with();
|
Chris@0
|
753
|
Chris@0
|
754 try {
|
Chris@0
|
755 $mock->right();
|
Chris@0
|
756 $this->fail('Expected exception');
|
Chris@14
|
757 } catch (ExpectationFailedException $e) {
|
Chris@0
|
758 $this->assertSame(
|
Chris@0
|
759 'SomeClass::right() was not expected to be called.',
|
Chris@0
|
760 $e->getMessage()
|
Chris@0
|
761 );
|
Chris@0
|
762 }
|
Chris@0
|
763
|
Chris@0
|
764 $this->resetMockObjects();
|
Chris@0
|
765 }
|
Chris@0
|
766
|
Chris@0
|
767 public function testVerificationOfNeverFailsWithAnyParameters()
|
Chris@0
|
768 {
|
Chris@14
|
769 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
770 ->setMethods(['right', 'wrong'])
|
Chris@14
|
771 ->getMock();
|
Chris@14
|
772
|
Chris@0
|
773 $mock->expects($this->never())
|
Chris@0
|
774 ->method('right')
|
Chris@0
|
775 ->withAnyParameters();
|
Chris@0
|
776
|
Chris@0
|
777 try {
|
Chris@0
|
778 $mock->right();
|
Chris@0
|
779 $this->fail('Expected exception');
|
Chris@14
|
780 } catch (ExpectationFailedException $e) {
|
Chris@0
|
781 $this->assertSame(
|
Chris@0
|
782 'SomeClass::right() was not expected to be called.',
|
Chris@0
|
783 $e->getMessage()
|
Chris@0
|
784 );
|
Chris@0
|
785 }
|
Chris@0
|
786
|
Chris@0
|
787 $this->resetMockObjects();
|
Chris@0
|
788 }
|
Chris@0
|
789
|
Chris@0
|
790 public function testWithAnythingInsteadOfWithAnyParameters()
|
Chris@0
|
791 {
|
Chris@14
|
792 $mock = $this->getMockBuilder(SomeClass::class)
|
Chris@14
|
793 ->setMethods(['right', 'wrong'])
|
Chris@14
|
794 ->getMock();
|
Chris@14
|
795
|
Chris@0
|
796 $mock->expects($this->once())
|
Chris@0
|
797 ->method('right')
|
Chris@0
|
798 ->with($this->anything());
|
Chris@0
|
799
|
Chris@0
|
800 try {
|
Chris@0
|
801 $mock->right();
|
Chris@0
|
802 $this->fail('Expected exception');
|
Chris@14
|
803 } catch (ExpectationFailedException $e) {
|
Chris@0
|
804 $this->assertSame(
|
Chris@14
|
805 'Expectation failed for method name is equal to "right" when invoked 1 time(s)' . PHP_EOL .
|
Chris@14
|
806 'Parameter count for invocation SomeClass::right() is too low.' . PHP_EOL .
|
Chris@14
|
807 'To allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.',
|
Chris@0
|
808 $e->getMessage()
|
Chris@0
|
809 );
|
Chris@0
|
810 }
|
Chris@0
|
811
|
Chris@0
|
812 $this->resetMockObjects();
|
Chris@0
|
813 }
|
Chris@0
|
814
|
Chris@0
|
815 /**
|
Chris@0
|
816 * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
|
Chris@0
|
817 */
|
Chris@0
|
818 public function testMockArgumentsPassedByReference()
|
Chris@0
|
819 {
|
Chris@0
|
820 $foo = $this->getMockBuilder('MethodCallbackByReference')
|
Chris@14
|
821 ->setMethods(['bar'])
|
Chris@0
|
822 ->disableOriginalConstructor()
|
Chris@0
|
823 ->disableArgumentCloning()
|
Chris@0
|
824 ->getMock();
|
Chris@0
|
825
|
Chris@0
|
826 $foo->expects($this->any())
|
Chris@0
|
827 ->method('bar')
|
Chris@14
|
828 ->will($this->returnCallback([$foo, 'callback']));
|
Chris@0
|
829
|
Chris@0
|
830 $a = $b = $c = 0;
|
Chris@0
|
831
|
Chris@0
|
832 $foo->bar($a, $b, $c);
|
Chris@0
|
833
|
Chris@0
|
834 $this->assertEquals(1, $b);
|
Chris@0
|
835 }
|
Chris@0
|
836
|
Chris@0
|
837 /**
|
Chris@0
|
838 * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
|
Chris@0
|
839 */
|
Chris@0
|
840 public function testMockArgumentsPassedByReference2()
|
Chris@0
|
841 {
|
Chris@0
|
842 $foo = $this->getMockBuilder('MethodCallbackByReference')
|
Chris@0
|
843 ->disableOriginalConstructor()
|
Chris@0
|
844 ->disableArgumentCloning()
|
Chris@0
|
845 ->getMock();
|
Chris@0
|
846
|
Chris@0
|
847 $foo->expects($this->any())
|
Chris@0
|
848 ->method('bar')
|
Chris@0
|
849 ->will($this->returnCallback(
|
Chris@0
|
850 function (&$a, &$b, $c) {
|
Chris@0
|
851 $b = 1;
|
Chris@0
|
852 }
|
Chris@0
|
853 ));
|
Chris@0
|
854
|
Chris@0
|
855 $a = $b = $c = 0;
|
Chris@0
|
856
|
Chris@0
|
857 $foo->bar($a, $b, $c);
|
Chris@0
|
858
|
Chris@0
|
859 $this->assertEquals(1, $b);
|
Chris@0
|
860 }
|
Chris@0
|
861
|
Chris@0
|
862 /**
|
Chris@14
|
863 * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116
|
Chris@0
|
864 */
|
Chris@0
|
865 public function testMockArgumentsPassedByReference3()
|
Chris@0
|
866 {
|
Chris@0
|
867 $foo = $this->getMockBuilder('MethodCallbackByReference')
|
Chris@14
|
868 ->setMethods(['bar'])
|
Chris@0
|
869 ->disableOriginalConstructor()
|
Chris@0
|
870 ->disableArgumentCloning()
|
Chris@0
|
871 ->getMock();
|
Chris@0
|
872
|
Chris@14
|
873 $a = new stdClass;
|
Chris@0
|
874 $b = $c = 0;
|
Chris@0
|
875
|
Chris@0
|
876 $foo->expects($this->any())
|
Chris@0
|
877 ->method('bar')
|
Chris@0
|
878 ->with($a, $b, $c)
|
Chris@14
|
879 ->will($this->returnCallback([$foo, 'callback']));
|
Chris@0
|
880
|
Chris@14
|
881 $this->assertNull($foo->bar($a, $b, $c));
|
Chris@0
|
882 }
|
Chris@0
|
883
|
Chris@0
|
884 /**
|
Chris@14
|
885 * @see https://github.com/sebastianbergmann/phpunit/issues/796
|
Chris@0
|
886 */
|
Chris@0
|
887 public function testMockArgumentsPassedByReference4()
|
Chris@0
|
888 {
|
Chris@0
|
889 $foo = $this->getMockBuilder('MethodCallbackByReference')
|
Chris@14
|
890 ->setMethods(['bar'])
|
Chris@0
|
891 ->disableOriginalConstructor()
|
Chris@0
|
892 ->disableArgumentCloning()
|
Chris@0
|
893 ->getMock();
|
Chris@0
|
894
|
Chris@14
|
895 $a = new stdClass;
|
Chris@0
|
896 $b = $c = 0;
|
Chris@0
|
897
|
Chris@0
|
898 $foo->expects($this->any())
|
Chris@0
|
899 ->method('bar')
|
Chris@14
|
900 ->with($this->isInstanceOf(stdClass::class), $b, $c)
|
Chris@14
|
901 ->will($this->returnCallback([$foo, 'callback']));
|
Chris@0
|
902
|
Chris@14
|
903 $this->assertNull($foo->bar($a, $b, $c));
|
Chris@0
|
904 }
|
Chris@0
|
905
|
Chris@0
|
906 /**
|
Chris@0
|
907 * @requires extension soap
|
Chris@0
|
908 */
|
Chris@0
|
909 public function testCreateMockFromWsdl()
|
Chris@0
|
910 {
|
Chris@0
|
911 $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'WsdlMock');
|
Chris@14
|
912
|
Chris@0
|
913 $this->assertStringStartsWith(
|
Chris@0
|
914 'Mock_WsdlMock_',
|
Chris@0
|
915 get_class($mock)
|
Chris@0
|
916 );
|
Chris@0
|
917 }
|
Chris@0
|
918
|
Chris@0
|
919 /**
|
Chris@0
|
920 * @requires extension soap
|
Chris@0
|
921 */
|
Chris@0
|
922 public function testCreateNamespacedMockFromWsdl()
|
Chris@0
|
923 {
|
Chris@0
|
924 $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'My\\Space\\WsdlMock');
|
Chris@14
|
925
|
Chris@0
|
926 $this->assertStringStartsWith(
|
Chris@0
|
927 'Mock_WsdlMock_',
|
Chris@0
|
928 get_class($mock)
|
Chris@0
|
929 );
|
Chris@0
|
930 }
|
Chris@0
|
931
|
Chris@0
|
932 /**
|
Chris@0
|
933 * @requires extension soap
|
Chris@0
|
934 */
|
Chris@0
|
935 public function testCreateTwoMocksOfOneWsdlFile()
|
Chris@0
|
936 {
|
Chris@14
|
937 $a = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
|
Chris@14
|
938 $b = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
|
Chris@14
|
939
|
Chris@14
|
940 $this->assertStringStartsWith('Mock_GoogleSearch_', get_class($a));
|
Chris@14
|
941 $this->assertEquals(get_class($a), get_class($b));
|
Chris@0
|
942 }
|
Chris@0
|
943
|
Chris@0
|
944 /**
|
Chris@17
|
945 * @requires extension soap
|
Chris@17
|
946 */
|
Chris@17
|
947 public function testCreateMockOfWsdlFileWithSpecialChars()
|
Chris@17
|
948 {
|
Chris@17
|
949 $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/Go ogle-Sea.rch.wsdl');
|
Chris@17
|
950
|
Chris@17
|
951 $this->assertStringStartsWith('Mock_GoogleSearch_', get_class($mock));
|
Chris@17
|
952 }
|
Chris@17
|
953
|
Chris@17
|
954 /**
|
Chris@0
|
955 * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/156
|
Chris@0
|
956 * @ticket 156
|
Chris@0
|
957 */
|
Chris@0
|
958 public function testInterfaceWithStaticMethodCanBeStubbed()
|
Chris@0
|
959 {
|
Chris@0
|
960 $this->assertInstanceOf(
|
Chris@14
|
961 InterfaceWithStaticMethod::class,
|
Chris@14
|
962 $this->getMockBuilder(InterfaceWithStaticMethod::class)->getMock()
|
Chris@0
|
963 );
|
Chris@0
|
964 }
|
Chris@0
|
965
|
Chris@0
|
966 public function testInvokingStubbedStaticMethodRaisesException()
|
Chris@0
|
967 {
|
Chris@14
|
968 $mock = $this->getMockBuilder(ClassWithStaticMethod::class)->getMock();
|
Chris@14
|
969
|
Chris@14
|
970 $this->expectException(\PHPUnit\Framework\MockObject\BadMethodCallException::class);
|
Chris@14
|
971
|
Chris@0
|
972 $mock->staticMethod();
|
Chris@0
|
973 }
|
Chris@0
|
974
|
Chris@0
|
975 /**
|
Chris@0
|
976 * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/171
|
Chris@0
|
977 * @ticket 171
|
Chris@0
|
978 */
|
Chris@0
|
979 public function testStubForClassThatImplementsSerializableCanBeCreatedWithoutInvokingTheConstructor()
|
Chris@0
|
980 {
|
Chris@0
|
981 $this->assertInstanceOf(
|
Chris@14
|
982 ClassThatImplementsSerializable::class,
|
Chris@14
|
983 $this->getMockBuilder(ClassThatImplementsSerializable::class)
|
Chris@0
|
984 ->disableOriginalConstructor()
|
Chris@0
|
985 ->getMock()
|
Chris@0
|
986 );
|
Chris@0
|
987 }
|
Chris@0
|
988
|
Chris@14
|
989 public function testGetMockForClassWithSelfTypeHint()
|
Chris@14
|
990 {
|
Chris@14
|
991 $this->assertInstanceOf(
|
Chris@14
|
992 ClassWithSelfTypeHint::class,
|
Chris@14
|
993 $this->getMockBuilder(ClassWithSelfTypeHint::class)->getMock()
|
Chris@14
|
994 );
|
Chris@14
|
995 }
|
Chris@14
|
996
|
Chris@0
|
997 private function resetMockObjects()
|
Chris@0
|
998 {
|
Chris@0
|
999 $refl = new ReflectionObject($this);
|
Chris@0
|
1000 $refl = $refl->getParentClass();
|
Chris@0
|
1001 $prop = $refl->getProperty('mockObjects');
|
Chris@0
|
1002 $prop->setAccessible(true);
|
Chris@14
|
1003 $prop->setValue($this, []);
|
Chris@14
|
1004 }
|
Chris@14
|
1005
|
Chris@14
|
1006 public function testStringableClassDoesNotThrow()
|
Chris@14
|
1007 {
|
Chris@14
|
1008 $mock = $this->getMockBuilder(StringableClass::class)->getMock();
|
Chris@14
|
1009
|
Chris@14
|
1010 $this->assertInternalType('string', (string) $mock);
|
Chris@14
|
1011 }
|
Chris@14
|
1012
|
Chris@14
|
1013 public function testStringableClassCanBeMocked()
|
Chris@14
|
1014 {
|
Chris@14
|
1015 $mock = $this->getMockBuilder(StringableClass::class)->getMock();
|
Chris@14
|
1016
|
Chris@14
|
1017 $mock->method('__toString')->willReturn('foo');
|
Chris@14
|
1018
|
Chris@14
|
1019 $this->assertSame('foo', (string) $mock);
|
Chris@14
|
1020 }
|
Chris@14
|
1021
|
Chris@14
|
1022 public function traversableProvider()
|
Chris@14
|
1023 {
|
Chris@14
|
1024 return [
|
Chris@14
|
1025 ['Traversable'],
|
Chris@14
|
1026 ['\Traversable'],
|
Chris@14
|
1027 ['TraversableMockTestInterface'],
|
Chris@14
|
1028 [['Traversable']],
|
Chris@14
|
1029 [['Iterator','Traversable']],
|
Chris@14
|
1030 [['\Iterator','\Traversable']]
|
Chris@14
|
1031 ];
|
Chris@14
|
1032 }
|
Chris@14
|
1033
|
Chris@14
|
1034 public function testParameterCallbackConstraintOnlyEvaluatedOnce()
|
Chris@14
|
1035 {
|
Chris@14
|
1036 $mock = $this->getMockBuilder(Foo::class)->setMethods(['bar'])->getMock();
|
Chris@14
|
1037 $expectedNumberOfCalls = 1;
|
Chris@14
|
1038 $callCount = 0;
|
Chris@14
|
1039
|
Chris@14
|
1040 $mock->expects($this->exactly($expectedNumberOfCalls))->method('bar')
|
Chris@14
|
1041 ->with($this->callback(function ($argument) use (&$callCount) {
|
Chris@14
|
1042 return $argument === 'call_' . $callCount++;
|
Chris@14
|
1043 }));
|
Chris@14
|
1044
|
Chris@14
|
1045 for ($i = 0; $i < $expectedNumberOfCalls; $i++) {
|
Chris@14
|
1046 $mock->bar('call_' . $i);
|
Chris@14
|
1047 }
|
Chris@14
|
1048 }
|
Chris@14
|
1049
|
Chris@14
|
1050 public function testReturnTypesAreMockedCorrectly()
|
Chris@14
|
1051 {
|
Chris@14
|
1052 /** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
|
Chris@14
|
1053 $stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);
|
Chris@14
|
1054
|
Chris@14
|
1055 $this->assertNull($stub->methodWithNoReturnTypeDeclaration());
|
Chris@14
|
1056 $this->assertSame('', $stub->methodWithStringReturnTypeDeclaration());
|
Chris@14
|
1057 $this->assertSame(0.0, $stub->methodWithFloatReturnTypeDeclaration());
|
Chris@14
|
1058 $this->assertSame(0, $stub->methodWithIntReturnTypeDeclaration());
|
Chris@14
|
1059 $this->assertFalse($stub->methodWithBoolReturnTypeDeclaration());
|
Chris@14
|
1060 $this->assertSame([], $stub->methodWithArrayReturnTypeDeclaration());
|
Chris@14
|
1061 $this->assertInstanceOf(MockObject::class, $stub->methodWithClassReturnTypeDeclaration());
|
Chris@14
|
1062 }
|
Chris@14
|
1063
|
Chris@14
|
1064 /**
|
Chris@14
|
1065 * @requires PHP 7.1
|
Chris@14
|
1066 */
|
Chris@14
|
1067 public function testVoidReturnTypeIsMockedCorrectly()
|
Chris@14
|
1068 {
|
Chris@14
|
1069 /** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
|
Chris@14
|
1070 $stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);
|
Chris@14
|
1071
|
Chris@14
|
1072 $this->assertNull($stub->methodWithVoidReturnTypeDeclaration());
|
Chris@14
|
1073 }
|
Chris@14
|
1074
|
Chris@14
|
1075 /**
|
Chris@14
|
1076 * @requires PHP 7.2
|
Chris@14
|
1077 */
|
Chris@14
|
1078 public function testObjectReturnTypeIsMockedCorrectly()
|
Chris@14
|
1079 {
|
Chris@14
|
1080 /** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
|
Chris@14
|
1081 $stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);
|
Chris@14
|
1082
|
Chris@14
|
1083 $this->assertInstanceOf(stdClass::class, $stub->methodWithObjectReturnTypeDeclaration());
|
Chris@0
|
1084 }
|
Chris@0
|
1085 }
|