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

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
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 }