Skip to content

HowTo - PHPUnit MockObject and the problem with "get_class()"

I know it's not the right way but if you are dealing with legacy code or find good reasons (like not storing the class name a database), if is needed that you have to use the php core function "get_class()". While you are implementing a unittest, you want to mock unneeded objects to focus on the area you need to test. Thats why you create a mockobject like:

$myMock->getMockBuilder('\My\Class')->getMock();
Problem with that, the return value of "get_class()" is something like "Mock_Class_b9e94bdd". Pretty frustrating if you ask me. After a long time of thinking and talking with other developers, we established the following solution.
abstract class AbstractClass { public function getClassName() { return get_class($this); } }
Now you only have to rewrite the code that is using "get_class()" by "$myClass->getClassName()". Du to the fact that $this represents the object, you don't have to trouble with late static bindings. Everything is working out of the box and you have touched a well known area of your code. I have added a example on one of my github repositories. By the way, don't get miss leaded by the method "setMockClassName()" provided by the "MockBuilder". If you use this method, your mock object has no mockmethods (like "expects()") anymore.

Trackbacks

No Trackbacks

Comments

Display comments as Linear | Threaded

No comments

Add Comment

E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
To leave a comment you must approve it via e-mail, which will be sent to your address after submission.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Markdown format allowed
Form options