MockObjectTest.php 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037
  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. public function testGetMockWithFixedClassNameCanProduceTheSameMockTwice()
  333. {
  334. $mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
  335. $mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
  336. $this->assertInstanceOf(stdClass::class, $mock);
  337. }
  338. public function testOriginalConstructorSettingConsidered()
  339. {
  340. $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
  341. ->getMock();
  342. $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
  343. ->disableOriginalConstructor()
  344. ->getMock();
  345. $this->assertTrue($mock1->constructorCalled);
  346. $this->assertFalse($mock2->constructorCalled);
  347. }
  348. public function testOriginalCloneSettingConsidered()
  349. {
  350. $mock1 = $this->getMockBuilder(PartialMockTestClass::class)
  351. ->getMock();
  352. $mock2 = $this->getMockBuilder(PartialMockTestClass::class)
  353. ->disableOriginalClone()
  354. ->getMock();
  355. $this->assertNotEquals(get_class($mock1), get_class($mock2));
  356. }
  357. public function testGetMockForAbstractClass()
  358. {
  359. $mock = $this->getMockBuilder(AbstractMockTestClass::class)
  360. ->getMock();
  361. $mock->expects($this->never())
  362. ->method('doSomething');
  363. }
  364. /**
  365. * @dataProvider traversableProvider
  366. */
  367. public function testGetMockForTraversable($type)
  368. {
  369. $mock = $this->getMockBuilder($type)
  370. ->getMock();
  371. $this->assertInstanceOf(Traversable::class, $mock);
  372. }
  373. public function testMultipleInterfacesCanBeMockedInSingleObject()
  374. {
  375. $mock = $this->getMockBuilder([AnInterface::class, AnotherInterface::class])
  376. ->getMock();
  377. $this->assertInstanceOf(AnInterface::class, $mock);
  378. $this->assertInstanceOf(AnotherInterface::class, $mock);
  379. }
  380. public function testGetMockForTrait()
  381. {
  382. $mock = $this->getMockForTrait(AbstractTrait::class);
  383. $mock->expects($this->never())
  384. ->method('doSomething');
  385. $parent = get_parent_class($mock);
  386. $traits = class_uses($parent, false);
  387. $this->assertContains(AbstractTrait::class, $traits);
  388. }
  389. public function testClonedMockObjectShouldStillEqualTheOriginal()
  390. {
  391. $a = $this->getMockBuilder(stdClass::class)
  392. ->getMock();
  393. $b = clone $a;
  394. $this->assertEquals($a, $b);
  395. }
  396. public function testMockObjectsConstructedIndepentantlyShouldBeEqual()
  397. {
  398. $a = $this->getMockBuilder(stdClass::class)
  399. ->getMock();
  400. $b = $this->getMockBuilder(stdClass::class)
  401. ->getMock();
  402. $this->assertEquals($a, $b);
  403. }
  404. public function testMockObjectsConstructedIndepentantlyShouldNotBeTheSame()
  405. {
  406. $a = $this->getMockBuilder(stdClass::class)
  407. ->getMock();
  408. $b = $this->getMockBuilder(stdClass::class)
  409. ->getMock();
  410. $this->assertNotSame($a, $b);
  411. }
  412. public function testClonedMockObjectCanBeUsedInPlaceOfOriginalOne()
  413. {
  414. $x = $this->getMockBuilder(stdClass::class)
  415. ->getMock();
  416. $y = clone $x;
  417. $mock = $this->getMockBuilder(stdClass::class)
  418. ->setMethods(['foo'])
  419. ->getMock();
  420. $mock->expects($this->once())
  421. ->method('foo')
  422. ->with($this->equalTo($x));
  423. $mock->foo($y);
  424. }
  425. public function testClonedMockObjectIsNotIdenticalToOriginalOne()
  426. {
  427. $x = $this->getMockBuilder(stdClass::class)
  428. ->getMock();
  429. $y = clone $x;
  430. $mock = $this->getMockBuilder(stdClass::class)
  431. ->setMethods(['foo'])
  432. ->getMock();
  433. $mock->expects($this->once())
  434. ->method('foo')
  435. ->with($this->logicalNot($this->identicalTo($x)));
  436. $mock->foo($y);
  437. }
  438. public function testObjectMethodCallWithArgumentCloningEnabled()
  439. {
  440. $expectedObject = new stdClass;
  441. $mock = $this->getMockBuilder('SomeClass')
  442. ->setMethods(['doSomethingElse'])
  443. ->enableArgumentCloning()
  444. ->getMock();
  445. $actualArguments = [];
  446. $mock->expects($this->any())
  447. ->method('doSomethingElse')
  448. ->will(
  449. $this->returnCallback(
  450. function () use (&$actualArguments) {
  451. $actualArguments = func_get_args();
  452. }
  453. )
  454. );
  455. $mock->doSomethingElse($expectedObject);
  456. $this->assertEquals(1, count($actualArguments));
  457. $this->assertEquals($expectedObject, $actualArguments[0]);
  458. $this->assertNotSame($expectedObject, $actualArguments[0]);
  459. }
  460. public function testObjectMethodCallWithArgumentCloningDisabled()
  461. {
  462. $expectedObject = new stdClass;
  463. $mock = $this->getMockBuilder('SomeClass')
  464. ->setMethods(['doSomethingElse'])
  465. ->disableArgumentCloning()
  466. ->getMock();
  467. $actualArguments = [];
  468. $mock->expects($this->any())
  469. ->method('doSomethingElse')
  470. ->will(
  471. $this->returnCallback(
  472. function () use (&$actualArguments) {
  473. $actualArguments = func_get_args();
  474. }
  475. )
  476. );
  477. $mock->doSomethingElse($expectedObject);
  478. $this->assertEquals(1, count($actualArguments));
  479. $this->assertSame($expectedObject, $actualArguments[0]);
  480. }
  481. public function testArgumentCloningOptionGeneratesUniqueMock()
  482. {
  483. $mockWithCloning = $this->getMockBuilder('SomeClass')
  484. ->setMethods(['doSomethingElse'])
  485. ->enableArgumentCloning()
  486. ->getMock();
  487. $mockWithoutCloning = $this->getMockBuilder('SomeClass')
  488. ->setMethods(['doSomethingElse'])
  489. ->disableArgumentCloning()
  490. ->getMock();
  491. $this->assertNotEquals($mockWithCloning, $mockWithoutCloning);
  492. }
  493. public function testVerificationOfMethodNameFailsWithoutParameters()
  494. {
  495. $mock = $this->getMockBuilder(SomeClass::class)
  496. ->setMethods(['right', 'wrong'])
  497. ->getMock();
  498. $mock->expects($this->once())
  499. ->method('right');
  500. $mock->wrong();
  501. try {
  502. $mock->__phpunit_verify();
  503. $this->fail('Expected exception');
  504. } catch (ExpectationFailedException $e) {
  505. $this->assertSame(
  506. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
  507. . "Method was expected to be called 1 times, actually called 0 times.\n",
  508. $e->getMessage()
  509. );
  510. }
  511. $this->resetMockObjects();
  512. }
  513. public function testVerificationOfMethodNameFailsWithParameters()
  514. {
  515. $mock = $this->getMockBuilder(SomeClass::class)
  516. ->setMethods(['right', 'wrong'])
  517. ->getMock();
  518. $mock->expects($this->once())
  519. ->method('right');
  520. $mock->wrong();
  521. try {
  522. $mock->__phpunit_verify();
  523. $this->fail('Expected exception');
  524. } catch (ExpectationFailedException $e) {
  525. $this->assertSame(
  526. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
  527. . "Method was expected to be called 1 times, actually called 0 times.\n",
  528. $e->getMessage()
  529. );
  530. }
  531. $this->resetMockObjects();
  532. }
  533. public function testVerificationOfMethodNameFailsWithWrongParameters()
  534. {
  535. $mock = $this->getMockBuilder(SomeClass::class)
  536. ->setMethods(['right', 'wrong'])
  537. ->getMock();
  538. $mock->expects($this->once())
  539. ->method('right')
  540. ->with(['first', 'second']);
  541. try {
  542. $mock->right(['second']);
  543. } catch (ExpectationFailedException $e) {
  544. $this->assertSame(
  545. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s)\n"
  546. . "Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.\n"
  547. . 'Failed asserting that two arrays are equal.',
  548. $e->getMessage()
  549. );
  550. }
  551. try {
  552. $mock->__phpunit_verify();
  553. $this->fail('Expected exception');
  554. } catch (ExpectationFailedException $e) {
  555. $this->assertSame(
  556. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s).\n"
  557. . "Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.\n"
  558. . "Failed asserting that two arrays are equal.\n"
  559. . "--- Expected\n"
  560. . "+++ Actual\n"
  561. . "@@ @@\n"
  562. . " Array (\n"
  563. . "- 0 => 'first'\n"
  564. . "- 1 => 'second'\n"
  565. . "+ 0 => 'second'\n"
  566. . " )\n",
  567. $e->getMessage()
  568. );
  569. }
  570. $this->resetMockObjects();
  571. }
  572. public function testVerificationOfNeverFailsWithEmptyParameters()
  573. {
  574. $mock = $this->getMockBuilder(SomeClass::class)
  575. ->setMethods(['right', 'wrong'])
  576. ->getMock();
  577. $mock->expects($this->never())
  578. ->method('right')
  579. ->with();
  580. try {
  581. $mock->right();
  582. $this->fail('Expected exception');
  583. } catch (ExpectationFailedException $e) {
  584. $this->assertSame(
  585. 'SomeClass::right() was not expected to be called.',
  586. $e->getMessage()
  587. );
  588. }
  589. $this->resetMockObjects();
  590. }
  591. public function testVerificationOfNeverFailsWithAnyParameters()
  592. {
  593. $mock = $this->getMockBuilder(SomeClass::class)
  594. ->setMethods(['right', 'wrong'])
  595. ->getMock();
  596. $mock->expects($this->never())
  597. ->method('right')
  598. ->withAnyParameters();
  599. try {
  600. $mock->right();
  601. $this->fail('Expected exception');
  602. } catch (ExpectationFailedException $e) {
  603. $this->assertSame(
  604. 'SomeClass::right() was not expected to be called.',
  605. $e->getMessage()
  606. );
  607. }
  608. $this->resetMockObjects();
  609. }
  610. public function testWithAnythingInsteadOfWithAnyParameters()
  611. {
  612. $mock = $this->getMockBuilder(SomeClass::class)
  613. ->setMethods(['right', 'wrong'])
  614. ->getMock();
  615. $mock->expects($this->once())
  616. ->method('right')
  617. ->with($this->anything());
  618. try {
  619. $mock->right();
  620. $this->fail('Expected exception');
  621. } catch (ExpectationFailedException $e) {
  622. $this->assertSame(
  623. "Expectation failed for method name is equal to <string:right> when invoked 1 time(s)\n" .
  624. "Parameter count for invocation SomeClass::right() is too low.\n" .
  625. 'To allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.',
  626. $e->getMessage()
  627. );
  628. }
  629. $this->resetMockObjects();
  630. }
  631. /**
  632. * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
  633. */
  634. public function testMockArgumentsPassedByReference()
  635. {
  636. $foo = $this->getMockBuilder('MethodCallbackByReference')
  637. ->setMethods(['bar'])
  638. ->disableOriginalConstructor()
  639. ->disableArgumentCloning()
  640. ->getMock();
  641. $foo->expects($this->any())
  642. ->method('bar')
  643. ->will($this->returnCallback([$foo, 'callback']));
  644. $a = $b = $c = 0;
  645. $foo->bar($a, $b, $c);
  646. $this->assertEquals(1, $b);
  647. }
  648. /**
  649. * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
  650. */
  651. public function testMockArgumentsPassedByReference2()
  652. {
  653. $foo = $this->getMockBuilder('MethodCallbackByReference')
  654. ->disableOriginalConstructor()
  655. ->disableArgumentCloning()
  656. ->getMock();
  657. $foo->expects($this->any())
  658. ->method('bar')
  659. ->will($this->returnCallback(
  660. function (&$a, &$b, $c) {
  661. $b = 1;
  662. }
  663. ));
  664. $a = $b = $c = 0;
  665. $foo->bar($a, $b, $c);
  666. $this->assertEquals(1, $b);
  667. }
  668. /**
  669. * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116
  670. */
  671. public function testMockArgumentsPassedByReference3()
  672. {
  673. $foo = $this->getMockBuilder('MethodCallbackByReference')
  674. ->setMethods(['bar'])
  675. ->disableOriginalConstructor()
  676. ->disableArgumentCloning()
  677. ->getMock();
  678. $a = new stdClass;
  679. $b = $c = 0;
  680. $foo->expects($this->any())
  681. ->method('bar')
  682. ->with($a, $b, $c)
  683. ->will($this->returnCallback([$foo, 'callback']));
  684. $this->assertNull($foo->bar($a, $b, $c));
  685. }
  686. /**
  687. * @see https://github.com/sebastianbergmann/phpunit/issues/796
  688. */
  689. public function testMockArgumentsPassedByReference4()
  690. {
  691. $foo = $this->getMockBuilder('MethodCallbackByReference')
  692. ->setMethods(['bar'])
  693. ->disableOriginalConstructor()
  694. ->disableArgumentCloning()
  695. ->getMock();
  696. $a = new stdClass;
  697. $b = $c = 0;
  698. $foo->expects($this->any())
  699. ->method('bar')
  700. ->with($this->isInstanceOf(stdClass::class), $b, $c)
  701. ->will($this->returnCallback([$foo, 'callback']));
  702. $this->assertNull($foo->bar($a, $b, $c));
  703. }
  704. /**
  705. * @requires extension soap
  706. */
  707. public function testCreateMockFromWsdl()
  708. {
  709. $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'WsdlMock');
  710. $this->assertStringStartsWith(
  711. 'Mock_WsdlMock_',
  712. get_class($mock)
  713. );
  714. }
  715. /**
  716. * @requires extension soap
  717. */
  718. public function testCreateNamespacedMockFromWsdl()
  719. {
  720. $mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'My\\Space\\WsdlMock');
  721. $this->assertStringStartsWith(
  722. 'Mock_WsdlMock_',
  723. get_class($mock)
  724. );
  725. }
  726. /**
  727. * @requires extension soap
  728. */
  729. public function testCreateTwoMocksOfOneWsdlFile()
  730. {
  731. $a = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
  732. $b = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
  733. $this->assertStringStartsWith('Mock_GoogleSearch_', get_class($a));
  734. $this->assertEquals(get_class($a), get_class($b));
  735. }
  736. /**
  737. * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/156
  738. * @ticket 156
  739. */
  740. public function testInterfaceWithStaticMethodCanBeStubbed()
  741. {
  742. $this->assertInstanceOf(
  743. InterfaceWithStaticMethod::class,
  744. $this->getMockBuilder(InterfaceWithStaticMethod::class)->getMock()
  745. );
  746. }
  747. /**
  748. * @expectedException PHPUnit_Framework_MockObject_BadMethodCallException
  749. */
  750. public function testInvokingStubbedStaticMethodRaisesException()
  751. {
  752. $mock = $this->getMockBuilder(ClassWithStaticMethod::class)->getMock();
  753. $mock->staticMethod();
  754. }
  755. /**
  756. * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/171
  757. * @ticket 171
  758. */
  759. public function testStubForClassThatImplementsSerializableCanBeCreatedWithoutInvokingTheConstructor()
  760. {
  761. $this->assertInstanceOf(
  762. ClassThatImplementsSerializable::class,
  763. $this->getMockBuilder(ClassThatImplementsSerializable::class)
  764. ->disableOriginalConstructor()
  765. ->getMock()
  766. );
  767. }
  768. public function testGetMockForClassWithSelfTypeHint()
  769. {
  770. $this->assertInstanceOf(
  771. ClassWithSelfTypeHint::class,
  772. $this->getMockBuilder(ClassWithSelfTypeHint::class)->getMock()
  773. );
  774. }
  775. private function resetMockObjects()
  776. {
  777. $refl = new ReflectionObject($this);
  778. $refl = $refl->getParentClass();
  779. $prop = $refl->getProperty('mockObjects');
  780. $prop->setAccessible(true);
  781. $prop->setValue($this, []);
  782. }
  783. public function testStringableClassDoesNotThrow()
  784. {
  785. $mock = $this->getMockBuilder(StringableClass::class)->getMock();
  786. $this->assertInternalType('string', (string) $mock);
  787. }
  788. public function testStringableClassCanBeMocked()
  789. {
  790. $mock = $this->getMockBuilder(StringableClass::class)->getMock();
  791. $mock->method('__toString')->willReturn('foo');
  792. $this->assertSame('foo', (string) $mock);
  793. }
  794. public function traversableProvider()
  795. {
  796. return [
  797. ['Traversable'],
  798. ['\Traversable'],
  799. ['TraversableMockTestInterface'],
  800. [['Traversable']],
  801. [['Iterator','Traversable']],
  802. [['\Iterator','\Traversable']]
  803. ];
  804. }
  805. public function testParameterCallbackConstraintOnlyEvaluatedOnce()
  806. {
  807. $mock = $this->getMockBuilder(Foo::class)->setMethods(['bar'])->getMock();
  808. $expectedNumberOfCalls = 1;
  809. $callCount = 0;
  810. $mock->expects($this->exactly($expectedNumberOfCalls))->method('bar')
  811. ->with($this->callback(function ($argument) use (&$callCount) {
  812. return $argument === 'call_' . $callCount++;
  813. }));
  814. for ($i = 0; $i < $expectedNumberOfCalls; $i++) {
  815. $mock->bar('call_' . $i);
  816. }
  817. }
  818. }