MockObjectTest.php 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040
  1. <?php
  2. /*
  3. * This file is part of the phpunit-mock-objects package.
  4. *
  5. * (c) Sebastian Bergmann <sebastian@phpunit.de>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. use PHPUnit\Framework\TestCase;
  11. use PHPUnit\Framework\ExpectationFailedException;
  12. class Framework_MockObjectTest extends TestCase
  13. {
  14. public function testMockedMethodIsNeverCalled()
  15. {
  16. $mock = $this->getMockBuilder(AnInterface::class)
  17. ->getMock();
  18. $mock->expects($this->never())
  19. ->method('doSomething');
  20. }
  21. public function testMockedMethodIsNeverCalledWithParameter()
  22. {
  23. $mock = $this->getMockBuilder(SomeClass::class)
  24. ->getMock();
  25. $mock->expects($this->never())
  26. ->method('doSomething')
  27. ->with('someArg');
  28. }
  29. /**
  30. * @doesNotPerformAssertions
  31. */
  32. public function testMockedMethodIsNotCalledWhenExpectsAnyWithParameter()
  33. {
  34. $mock = $this->getMockBuilder(SomeClass::class)
  35. ->getMock();
  36. $mock->expects($this->any())
  37. ->method('doSomethingElse')
  38. ->with('someArg');
  39. }
  40. /**
  41. * @doesNotPerformAssertions
  42. */
  43. public function testMockedMethodIsNotCalledWhenMethodSpecifiedDirectlyWithParameter()
  44. {
  45. $mock = $this->getMockBuilder(SomeClass::class)
  46. ->getMock();
  47. $mock->method('doSomethingElse')
  48. ->with('someArg');
  49. }
  50. public function testMockedMethodIsCalledAtLeastOnce()
  51. {
  52. $mock = $this->getMockBuilder(AnInterface::class)
  53. ->getMock();
  54. $mock->expects($this->atLeastOnce())
  55. ->method('doSomething');
  56. $mock->doSomething();
  57. }
  58. public function testMockedMethodIsCalledAtLeastOnce2()
  59. {
  60. $mock = $this->getMockBuilder(AnInterface::class)
  61. ->getMock();
  62. $mock->expects($this->atLeastOnce())
  63. ->method('doSomething');
  64. $mock->doSomething();
  65. $mock->doSomething();
  66. }
  67. public function testMockedMethodIsCalledAtLeastTwice()
  68. {
  69. $mock = $this->getMockBuilder(AnInterface::class)
  70. ->getMock();
  71. $mock->expects($this->atLeast(2))
  72. ->method('doSomething');
  73. $mock->doSomething();
  74. $mock->doSomething();
  75. }
  76. public function testMockedMethodIsCalledAtLeastTwice2()
  77. {
  78. $mock = $this->getMockBuilder(AnInterface::class)
  79. ->getMock();
  80. $mock->expects($this->atLeast(2))
  81. ->method('doSomething');
  82. $mock->doSomething();
  83. $mock->doSomething();
  84. $mock->doSomething();
  85. }
  86. public function testMockedMethodIsCalledAtMostTwice()
  87. {
  88. $mock = $this->getMockBuilder(AnInterface::class)
  89. ->getMock();
  90. $mock->expects($this->atMost(2))
  91. ->method('doSomething');
  92. $mock->doSomething();
  93. $mock->doSomething();
  94. }
  95. public function testMockedMethodIsCalledAtMosttTwice2()
  96. {
  97. $mock = $this->getMockBuilder(AnInterface::class)
  98. ->getMock();
  99. $mock->expects($this->atMost(2))
  100. ->method('doSomething');
  101. $mock->doSomething();
  102. }
  103. public function testMockedMethodIsCalledOnce()
  104. {
  105. $mock = $this->getMockBuilder(AnInterface::class)
  106. ->getMock();
  107. $mock->expects($this->once())
  108. ->method('doSomething');
  109. $mock->doSomething();
  110. }
  111. public function testMockedMethodIsCalledOnceWithParameter()
  112. {
  113. $mock = $this->getMockBuilder(SomeClass::class)
  114. ->getMock();
  115. $mock->expects($this->once())
  116. ->method('doSomethingElse')
  117. ->with($this->equalTo('something'));
  118. $mock->doSomethingElse('something');
  119. }
  120. public function testMockedMethodIsCalledExactly()
  121. {
  122. $mock = $this->getMockBuilder(AnInterface::class)
  123. ->getMock();
  124. $mock->expects($this->exactly(2))
  125. ->method('doSomething');
  126. $mock->doSomething();
  127. $mock->doSomething();
  128. }
  129. public function testStubbedException()
  130. {
  131. $mock = $this->getMockBuilder(AnInterface::class)
  132. ->getMock();
  133. $mock->expects($this->any())
  134. ->method('doSomething')
  135. ->will($this->throwException(new Exception));
  136. $this->expectException(Exception::class);
  137. $mock->doSomething();
  138. }
  139. public function testStubbedWillThrowException()
  140. {
  141. $mock = $this->getMockBuilder(AnInterface::class)
  142. ->getMock();
  143. $mock->expects($this->any())
  144. ->method('doSomething')
  145. ->willThrowException(new Exception);
  146. $this->expectException(Exception::class);
  147. $mock->doSomething();
  148. }
  149. public function testStubbedReturnValue()
  150. {
  151. $mock = $this->getMockBuilder(AnInterface::class)
  152. ->getMock();
  153. $mock->expects($this->any())
  154. ->method('doSomething')
  155. ->will($this->returnValue('something'));
  156. $this->assertEquals('something', $mock->doSomething());
  157. $mock = $this->getMockBuilder(AnInterface::class)
  158. ->getMock();
  159. $mock->expects($this->any())
  160. ->method('doSomething')
  161. ->willReturn('something');
  162. $this->assertEquals('something', $mock->doSomething());
  163. }
  164. public function testStubbedReturnValueMap()
  165. {
  166. $map = [
  167. ['a', 'b', 'c', 'd'],
  168. ['e', 'f', 'g', 'h']
  169. ];
  170. $mock = $this->getMockBuilder(AnInterface::class)
  171. ->getMock();
  172. $mock->expects($this->any())
  173. ->method('doSomething')
  174. ->will($this->returnValueMap($map));
  175. $this->assertEquals('d', $mock->doSomething('a', 'b', 'c'));
  176. $this->assertEquals('h', $mock->doSomething('e', 'f', 'g'));
  177. $this->assertEquals(null, $mock->doSomething('foo', 'bar'));
  178. $mock = $this->getMockBuilder(AnInterface::class)
  179. ->getMock();
  180. $mock->expects($this->any())
  181. ->method('doSomething')
  182. ->willReturnMap($map);
  183. $this->assertEquals('d', $mock->doSomething('a', 'b', 'c'));
  184. $this->assertEquals('h', $mock->doSomething('e', 'f', 'g'));
  185. $this->assertEquals(null, $mock->doSomething('foo', 'bar'));
  186. }
  187. public function testStubbedReturnArgument()
  188. {
  189. $mock = $this->getMockBuilder(AnInterface::class)
  190. ->getMock();
  191. $mock->expects($this->any())
  192. ->method('doSomething')
  193. ->will($this->returnArgument(1));
  194. $this->assertEquals('b', $mock->doSomething('a', 'b'));
  195. $mock = $this->getMockBuilder(AnInterface::class)
  196. ->getMock();
  197. $mock->expects($this->any())
  198. ->method('doSomething')
  199. ->willReturnArgument(1);
  200. $this->assertEquals('b', $mock->doSomething('a', 'b'));
  201. }
  202. public function testFunctionCallback()
  203. {
  204. $mock = $this->getMockBuilder(SomeClass::class)
  205. ->setMethods(['doSomething'])
  206. ->getMock();
  207. $mock->expects($this->once())
  208. ->method('doSomething')
  209. ->will($this->returnCallback('functionCallback'));
  210. $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
  211. $mock = $this->getMockBuilder(SomeClass::class)
  212. ->setMethods(['doSomething'])
  213. ->getMock();
  214. $mock->expects($this->once())
  215. ->method('doSomething')
  216. ->willReturnCallback('functionCallback');
  217. $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
  218. }
  219. public function testStubbedReturnSelf()
  220. {
  221. $mock = $this->getMockBuilder(AnInterface::class)
  222. ->getMock();
  223. $mock->expects($this->any())
  224. ->method('doSomething')
  225. ->will($this->returnSelf());
  226. $this->assertEquals($mock, $mock->doSomething());
  227. $mock = $this->getMockBuilder(AnInterface::class)
  228. ->getMock();
  229. $mock->expects($this->any())
  230. ->method('doSomething')
  231. ->willReturnSelf();
  232. $this->assertEquals($mock, $mock->doSomething());
  233. }
  234. public function testStubbedReturnOnConsecutiveCalls()
  235. {
  236. $mock = $this->getMockBuilder(AnInterface::class)
  237. ->getMock();
  238. $mock->expects($this->any())
  239. ->method('doSomething')
  240. ->will($this->onConsecutiveCalls('a', 'b', 'c'));
  241. $this->assertEquals('a', $mock->doSomething());
  242. $this->assertEquals('b', $mock->doSomething());
  243. $this->assertEquals('c', $mock->doSomething());
  244. $mock = $this->getMockBuilder(AnInterface::class)
  245. ->getMock();
  246. $mock->expects($this->any())
  247. ->method('doSomething')
  248. ->willReturnOnConsecutiveCalls('a', 'b', 'c');
  249. $this->assertEquals('a', $mock->doSomething());
  250. $this->assertEquals('b', $mock->doSomething());
  251. $this->assertEquals('c', $mock->doSomething());
  252. }
  253. public function testStaticMethodCallback()
  254. {
  255. $mock = $this->getMockBuilder(SomeClass::class)
  256. ->setMethods(['doSomething'])
  257. ->getMock();
  258. $mock->expects($this->once())
  259. ->method('doSomething')
  260. ->will($this->returnCallback(['MethodCallback', 'staticCallback']));
  261. $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
  262. }
  263. public function testPublicMethodCallback()
  264. {
  265. $mock = $this->getMockBuilder(SomeClass::class)
  266. ->setMethods(['doSomething'])
  267. ->getMock();
  268. $mock->expects($this->once())
  269. ->method('doSomething')
  270. ->will($this->returnCallback([new MethodCallback, 'nonStaticCallback']));
  271. $this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
  272. }
  273. public function testMockClassOnlyGeneratedOnce()
  274. {
  275. $mock1 = $this->getMockBuilder(AnInterface::class)
  276. ->getMock();
  277. $mock2 = $this->getMockBuilder(AnInterface::class)
  278. ->getMock();
  279. $this->assertEquals(get_class($mock1), get_class($mock2));
  280. }
  281. public function testMockClassDifferentForPartialMocks()
  282. {
  283. $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
  284. ->getMock();
  285. $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
  286. ->setMethods(['doSomething'])
  287. ->getMock();
  288. $mock3 = $this->getMockBuilder(PartialMockTestClass::class)
  289. ->setMethods(['doSomething'])
  290. ->getMock();
  291. $mock4 = $this->getMockBuilder(PartialMockTestClass::class)
  292. ->setMethods(['doAnotherThing'])
  293. ->getMock();
  294. $mock5 = $this->getMockBuilder(PartialMockTestClass::class)
  295. ->setMethods(['doAnotherThing'])
  296. ->getMock();
  297. $this->assertNotEquals(get_class($mock1), get_class($mock2));
  298. $this->assertNotEquals(get_class($mock1), get_class($mock3));
  299. $this->assertNotEquals(get_class($mock1), get_class($mock4));
  300. $this->assertNotEquals(get_class($mock1), get_class($mock5));
  301. $this->assertEquals(get_class($mock2), get_class($mock3));
  302. $this->assertNotEquals(get_class($mock2), get_class($mock4));
  303. $this->assertNotEquals(get_class($mock2), get_class($mock5));
  304. $this->assertEquals(get_class($mock4), get_class($mock5));
  305. }
  306. public function testMockClassStoreOverrulable()
  307. {
  308. $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
  309. ->getMock();
  310. $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
  311. ->setMockClassName('MyMockClassNameForPartialMockTestClass1')
  312. ->getMock();
  313. $mock3 = $this->getMockBuilder(PartialMockTestClass::class)
  314. ->getMock();
  315. $mock4 = $this->getMockBuilder(PartialMockTestClass::class)
  316. ->setMethods(['doSomething'])
  317. ->setMockClassName('AnotherMockClassNameForPartialMockTestClass')
  318. ->getMock();
  319. $mock5 = $this->getMockBuilder(PartialMockTestClass::class)
  320. ->setMockClassName('MyMockClassNameForPartialMockTestClass2')
  321. ->getMock();
  322. $this->assertNotEquals(get_class($mock1), get_class($mock2));
  323. $this->assertEquals(get_class($mock1), get_class($mock3));
  324. $this->assertNotEquals(get_class($mock1), get_class($mock4));
  325. $this->assertNotEquals(get_class($mock2), get_class($mock3));
  326. $this->assertNotEquals(get_class($mock2), get_class($mock4));
  327. $this->assertNotEquals(get_class($mock2), get_class($mock5));
  328. $this->assertNotEquals(get_class($mock3), get_class($mock4));
  329. $this->assertNotEquals(get_class($mock3), get_class($mock5));
  330. $this->assertNotEquals(get_class($mock4), get_class($mock5));
  331. }
  332. /**
  333. * @covers PHPUnit_Framework_MockObject_Generator::getMock
  334. */
  335. public function testGetMockWithFixedClassNameCanProduceTheSameMockTwice()
  336. {
  337. $mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
  338. $mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
  339. $this->assertInstanceOf(stdClass::class, $mock);
  340. }
  341. public function testOriginalConstructorSettingConsidered()
  342. {
  343. $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
  344. ->getMock();
  345. $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
  346. ->disableOriginalConstructor()
  347. ->getMock();
  348. $this->assertTrue($mock1->constructorCalled);
  349. $this->assertFalse($mock2->constructorCalled);
  350. }
  351. public function testOriginalCloneSettingConsidered()
  352. {
  353. $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
  354. ->getMock();
  355. $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
  356. ->disableOriginalClone()
  357. ->getMock();
  358. $this->assertNotEquals(get_class($mock1), get_class($mock2));
  359. }
  360. public function testGetMockForAbstractClass()
  361. {
  362. $mock = $this->getMockBuilder(AbstractMockTestClass::class)
  363. ->getMock();
  364. $mock->expects($this->never())
  365. ->method('doSomething');
  366. }
  367. /**
  368. * @dataProvider traversableProvider
  369. */
  370. public function testGetMockForTraversable($type)
  371. {
  372. $mock = $this->getMockBuilder($type)
  373. ->getMock();
  374. $this->assertInstanceOf(Traversable::class, $mock);
  375. }
  376. public function testMultipleInterfacesCanBeMockedInSingleObject()
  377. {
  378. $mock = $this->getMockBuilder([AnInterface::class, AnotherInterface::class])
  379. ->getMock();
  380. $this->assertInstanceOf(AnInterface::class, $mock);
  381. $this->assertInstanceOf(AnotherInterface::class, $mock);
  382. }
  383. public function testGetMockForTrait()
  384. {
  385. $mock = $this->getMockForTrait(AbstractTrait::class);
  386. $mock->expects($this->never())
  387. ->method('doSomething');
  388. $parent = get_parent_class($mock);
  389. $traits = class_uses($parent, false);
  390. $this->assertContains(AbstractTrait::class, $traits);
  391. }
  392. public function testClonedMockObjectShouldStillEqualTheOriginal()
  393. {
  394. $a = $this->getMockBuilder(stdClass::class)
  395. ->getMock();
  396. $b = clone $a;
  397. $this->assertEquals($a, $b);
  398. }
  399. public function testMockObjectsConstructedIndepentantlyShouldBeEqual()
  400. {
  401. $a = $this->getMockBuilder(stdClass::class)
  402. ->getMock();
  403. $b = $this->getMockBuilder(stdClass::class)
  404. ->getMock();
  405. $this->assertEquals($a, $b);
  406. }
  407. public function testMockObjectsConstructedIndepentantlyShouldNotBeTheSame()
  408. {
  409. $a = $this->getMockBuilder(stdClass::class)
  410. ->getMock();
  411. $b = $this->getMockBuilder(stdClass::class)
  412. ->getMock();
  413. $this->assertNotSame($a, $b);
  414. }
  415. public function testClonedMockObjectCanBeUsedInPlaceOfOriginalOne()
  416. {
  417. $x = $this->getMockBuilder(stdClass::class)
  418. ->getMock();
  419. $y = clone $x;
  420. $mock = $this->getMockBuilder(stdClass::class)
  421. ->setMethods(['foo'])
  422. ->getMock();
  423. $mock->expects($this->once())
  424. ->method('foo')
  425. ->with($this->equalTo($x));
  426. $mock->foo($y);
  427. }
  428. public function testClonedMockObjectIsNotIdenticalToOriginalOne()
  429. {
  430. $x = $this->getMockBuilder(stdClass::class)
  431. ->getMock();
  432. $y = clone $x;
  433. $mock = $this->getMockBuilder(stdClass::class)
  434. ->setMethods(['foo'])
  435. ->getMock();
  436. $mock->expects($this->once())
  437. ->method('foo')
  438. ->with($this->logicalNot($this->identicalTo($x)));
  439. $mock->foo($y);
  440. }
  441. public function testObjectMethodCallWithArgumentCloningEnabled()
  442. {
  443. $expectedObject = new stdClass;
  444. $mock = $this->getMockBuilder('SomeClass')
  445. ->setMethods(['doSomethingElse'])
  446. ->enableArgumentCloning()
  447. ->getMock();
  448. $actualArguments = [];
  449. $mock->expects($this->any())
  450. ->method('doSomethingElse')
  451. ->will(
  452. $this->returnCallback(
  453. function () use (&$actualArguments) {
  454. $actualArguments = func_get_args();
  455. }
  456. )
  457. );
  458. $mock->doSomethingElse($expectedObject);
  459. $this->assertEquals(1, count($actualArguments));
  460. $this->assertEquals($expectedObject, $actualArguments[0]);
  461. $this->assertNotSame($expectedObject, $actualArguments[0]);
  462. }
  463. public function testObjectMethodCallWithArgumentCloningDisabled()
  464. {
  465. $expectedObject = new stdClass;
  466. $mock = $this->getMockBuilder('SomeClass')
  467. ->setMethods(['doSomethingElse'])
  468. ->disableArgumentCloning()
  469. ->getMock();
  470. $actualArguments = [];
  471. $mock->expects($this->any())
  472. ->method('doSomethingElse')
  473. ->will(
  474. $this->returnCallback(
  475. function () use (&$actualArguments) {
  476. $actualArguments = func_get_args();
  477. }
  478. )
  479. );
  480. $mock->doSomethingElse($expectedObject);
  481. $this->assertEquals(1, count($actualArguments));
  482. $this->assertSame($expectedObject, $actualArguments[0]);
  483. }
  484. public function testArgumentCloningOptionGeneratesUniqueMock()
  485. {
  486. $mockWithCloning = $this->getMockBuilder('SomeClass')
  487. ->setMethods(['doSomethingElse'])
  488. ->enableArgumentCloning()
  489. ->getMock();
  490. $mockWithoutCloning = $this->getMockBuilder('SomeClass')
  491. ->setMethods(['doSomethingElse'])
  492. ->disableArgumentCloning()
  493. ->getMock();
  494. $this->assertNotEquals($mockWithCloning, $mockWithoutCloning);
  495. }
  496. public function testVerificationOfMethodNameFailsWithoutParameters()
  497. {
  498. $mock = $this->getMockBuilder(SomeClass::class)
  499. ->setMethods(['right', 'wrong'])
  500. ->getMock();
  501. $mock->expects($this->once())
  502. ->method('right');
  503. $mock->wrong();
  504. try {
  505. $mock->__phpunit_verify();
  506. $this->fail('Expected exception');
  507. } catch (ExpectationFailedException $e) {
  508. $this->assertSame(
  509. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
  510. . "Method was expected to be called 1 times, actually called 0 times.\n",
  511. $e->getMessage()
  512. );
  513. }
  514. $this->resetMockObjects();
  515. }
  516. public function testVerificationOfMethodNameFailsWithParameters()
  517. {
  518. $mock = $this->getMockBuilder(SomeClass::class)
  519. ->setMethods(['right', 'wrong'])
  520. ->getMock();
  521. $mock->expects($this->once())
  522. ->method('right');
  523. $mock->wrong();
  524. try {
  525. $mock->__phpunit_verify();
  526. $this->fail('Expected exception');
  527. } catch (ExpectationFailedException $e) {
  528. $this->assertSame(
  529. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
  530. . "Method was expected to be called 1 times, actually called 0 times.\n",
  531. $e->getMessage()
  532. );
  533. }
  534. $this->resetMockObjects();
  535. }
  536. public function testVerificationOfMethodNameFailsWithWrongParameters()
  537. {
  538. $mock = $this->getMockBuilder(SomeClass::class)
  539. ->setMethods(['right', 'wrong'])
  540. ->getMock();
  541. $mock->expects($this->once())
  542. ->method('right')
  543. ->with(['first', 'second']);
  544. try {
  545. $mock->right(['second']);
  546. } catch (ExpectationFailedException $e) {
  547. $this->assertSame(
  548. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s)\n"
  549. . "Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.\n"
  550. . 'Failed asserting that two arrays are equal.',
  551. $e->getMessage()
  552. );
  553. }
  554. try {
  555. $mock->__phpunit_verify();
  556. $this->fail('Expected exception');
  557. } catch (ExpectationFailedException $e) {
  558. $this->assertSame(
  559. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
  560. . "Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.\n"
  561. . "Failed asserting that two arrays are equal.\n"
  562. . "--- Expected\n"
  563. . "+++ Actual\n"
  564. . "@@ @@\n"
  565. . " Array (\n"
  566. . "- 0 => 'first'\n"
  567. . "- 1 => 'second'\n"
  568. . "+ 0 => 'second'\n"
  569. . " )\n",
  570. $e->getMessage()
  571. );
  572. }
  573. $this->resetMockObjects();
  574. }
  575. public function testVerificationOfNeverFailsWithEmptyParameters()
  576. {
  577. $mock = $this->getMockBuilder(SomeClass::class)
  578. ->setMethods(['right', 'wrong'])
  579. ->getMock();
  580. $mock->expects($this->never())
  581. ->method('right')
  582. ->with();
  583. try {
  584. $mock->right();
  585. $this->fail('Expected exception');
  586. } catch (ExpectationFailedException $e) {
  587. $this->assertSame(
  588. 'SomeClass::right() was not expected to be called.',
  589. $e->getMessage()
  590. );
  591. }
  592. $this->resetMockObjects();
  593. }
  594. public function testVerificationOfNeverFailsWithAnyParameters()
  595. {
  596. $mock = $this->getMockBuilder(SomeClass::class)
  597. ->setMethods(['right', 'wrong'])
  598. ->getMock();
  599. $mock->expects($this->never())
  600. ->method('right')
  601. ->withAnyParameters();
  602. try {
  603. $mock->right();
  604. $this->fail('Expected exception');
  605. } catch (ExpectationFailedException $e) {
  606. $this->assertSame(
  607. 'SomeClass::right() was not expected to be called.',
  608. $e->getMessage()
  609. );
  610. }
  611. $this->resetMockObjects();
  612. }
  613. public function testWithAnythingInsteadOfWithAnyParameters()
  614. {
  615. $mock = $this->getMockBuilder(SomeClass::class)
  616. ->setMethods(['right', 'wrong'])
  617. ->getMock();
  618. $mock->expects($this->once())
  619. ->method('right')
  620. ->with($this->anything());
  621. try {
  622. $mock->right();
  623. $this->fail('Expected exception');
  624. } catch (ExpectationFailedException $e) {
  625. $this->assertSame(
  626. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s)\n" .
  627. "Parameter count for invocation SomeClass::right() is too low.\n" .
  628. 'To allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.',
  629. $e->getMessage()
  630. );
  631. }
  632. $this->resetMockObjects();
  633. }
  634. /**
  635. * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
  636. */
  637. public function testMockArgumentsPassedByReference()
  638. {
  639. $foo = $this->getMockBuilder('MethodCallbackByReference')
  640. ->setMethods(['bar'])
  641. ->disableOriginalConstructor()
  642. ->disableArgumentCloning()
  643. ->getMock();
  644. $foo->expects($this->any())
  645. ->method('bar')
  646. ->will($this->returnCallback([$foo, 'callback']));
  647. $a = $b = $c = 0;
  648. $foo->bar($a, $b, $c);
  649. $this->assertEquals(1, $b);
  650. }
  651. /**
  652. * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
  653. */
  654. public function testMockArgumentsPassedByReference2()
  655. {
  656. $foo = $this->getMockBuilder('MethodCallbackByReference')
  657. ->disableOriginalConstructor()
  658. ->disableArgumentCloning()
  659. ->getMock();
  660. $foo->expects($this->any())
  661. ->method('bar')
  662. ->will($this->returnCallback(
  663. function (&$a, &$b, $c) {
  664. $b = 1;
  665. }
  666. ));
  667. $a = $b = $c = 0;
  668. $foo->bar($a, $b, $c);
  669. $this->assertEquals(1, $b);
  670. }
  671. /**
  672. * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116
  673. */
  674. public function testMockArgumentsPassedByReference3()
  675. {
  676. $foo = $this->getMockBuilder('MethodCallbackByReference')
  677. ->setMethods(['bar'])
  678. ->disableOriginalConstructor()
  679. ->disableArgumentCloning()
  680. ->getMock();
  681. $a = new stdClass;
  682. $b = $c = 0;
  683. $foo->expects($this->any())
  684. ->method('bar')
  685. ->with($a, $b, $c)
  686. ->will($this->returnCallback([$foo, 'callback']));
  687. $this->assertNull($foo->bar($a, $b, $c));
  688. }
  689. /**
  690. * @see https://github.com/sebastianbergmann/phpunit/issues/796
  691. */
  692. public function testMockArgumentsPassedByReference4()
  693. {
  694. $foo = $this->getMockBuilder('MethodCallbackByReference')
  695. ->setMethods(['bar'])
  696. ->disableOriginalConstructor()
  697. ->disableArgumentCloning()
  698. ->getMock();
  699. $a = new stdClass;
  700. $b = $c = 0;
  701. $foo->expects($this->any())
  702. ->method('bar')
  703. ->with($this->isInstanceOf(stdClass::class), $b, $c)
  704. ->will($this->returnCallback([$foo, 'callback']));
  705. $this->assertNull($foo->bar($a, $b, $c));
  706. }
  707. /**
  708. * @requires extension soap
  709. */
  710. public function testCreateMockFromWsdl()
  711. {
  712. $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'WsdlMock');
  713. $this->assertStringStartsWith(
  714. 'Mock_WsdlMock_',
  715. get_class($mock)
  716. );
  717. }
  718. /**
  719. * @requires extension soap
  720. */
  721. public function testCreateNamespacedMockFromWsdl()
  722. {
  723. $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'My\\Space\\WsdlMock');
  724. $this->assertStringStartsWith(
  725. 'Mock_WsdlMock_',
  726. get_class($mock)
  727. );
  728. }
  729. /**
  730. * @requires extension soap
  731. */
  732. public function testCreateTwoMocksOfOneWsdlFile()
  733. {
  734. $a = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
  735. $b = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
  736. $this->assertStringStartsWith('Mock_GoogleSearch_', get_class($a));
  737. $this->assertEquals(get_class($a), get_class($b));
  738. }
  739. /**
  740. * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/156
  741. * @ticket 156
  742. */
  743. public function testInterfaceWithStaticMethodCanBeStubbed()
  744. {
  745. $this->assertInstanceOf(
  746. InterfaceWithStaticMethod::class,
  747. $this->getMockBuilder(InterfaceWithStaticMethod::class)->getMock()
  748. );
  749. }
  750. /**
  751. * @expectedException PHPUnit_Framework_MockObject_BadMethodCallException
  752. */
  753. public function testInvokingStubbedStaticMethodRaisesException()
  754. {
  755. $mock = $this->getMockBuilder(ClassWithStaticMethod::class)->getMock();
  756. $mock->staticMethod();
  757. }
  758. /**
  759. * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/171
  760. * @ticket 171
  761. */
  762. public function testStubForClassThatImplementsSerializableCanBeCreatedWithoutInvokingTheConstructor()
  763. {
  764. $this->assertInstanceOf(
  765. ClassThatImplementsSerializable::class,
  766. $this->getMockBuilder(ClassThatImplementsSerializable::class)
  767. ->disableOriginalConstructor()
  768. ->getMock()
  769. );
  770. }
  771. public function testGetMockForClassWithSelfTypeHint()
  772. {
  773. $this->assertInstanceOf(
  774. ClassWithSelfTypeHint::class,
  775. $this->getMockBuilder(ClassWithSelfTypeHint::class)->getMock()
  776. );
  777. }
  778. private function resetMockObjects()
  779. {
  780. $refl = new ReflectionObject($this);
  781. $refl = $refl->getParentClass();
  782. $prop = $refl->getProperty('mockObjects');
  783. $prop->setAccessible(true);
  784. $prop->setValue($this, []);
  785. }
  786. public function testStringableClassDoesNotThrow()
  787. {
  788. $mock = $this->getMockBuilder(StringableClass::class)->getMock();
  789. $this->assertInternalType('string', (string) $mock);
  790. }
  791. public function testStringableClassCanBeMocked()
  792. {
  793. $mock = $this->getMockBuilder(StringableClass::class)->getMock();
  794. $mock->method('__toString')->willReturn('foo');
  795. $this->assertSame('foo', (string) $mock);
  796. }
  797. public function traversableProvider()
  798. {
  799. return [
  800. ['Traversable'],
  801. ['\Traversable'],
  802. ['TraversableMockTestInterface'],
  803. [['Traversable']],
  804. [['Iterator','Traversable']],
  805. [['\Iterator','\Traversable']]
  806. ];
  807. }
  808. public function testParameterCallbackConstraintOnlyEvaluatedOnce()
  809. {
  810. $mock = $this->getMockBuilder(Foo::class)->setMethods(['bar'])->getMock();
  811. $expectedNumberOfCalls = 1;
  812. $callCount = 0;
  813. $mock->expects($this->exactly($expectedNumberOfCalls))->method('bar')
  814. ->with($this->callback(function ($argument) use (&$callCount) {
  815. return $argument === 'call_' . $callCount++;
  816. }));
  817. for ($i = 0; $i < $expectedNumberOfCalls; $i++) {
  818. $mock->bar('call_' . $i);
  819. }
  820. }
  821. }