markus
markus

Reputation: 40675

How to add mocked expectations to a class under test

The code to be tested

abstract class Parent
{
    public function getSomething(){} //this has to be mocked
}

class Child extends Parent
{
    public function methodWhichIsTested()
    {
        $something = $this->getSomething(); //call to parent method
    }
}

The test

public function setUp()
{
    $this->child = new Child;
}

public function testTheChildMethod()
{
    $this->child->methodWhichIsTested();
}

How can I add mock expectations to the instantiated class Child? I would like to do something like:

MockFramework->takeExistingClass('Child')->shouldRecieve('getSomething')->andReturn('whatever');

My problem is, that in the real case (not the example), the getSomething method returns a dependency, which I need to mock!

I am using Mockery but if you know how to do this with phpUnit mocks, go ahead! Maybe I'm making a basic thinking mistake, please give me a hand! Thanks.

Upvotes: 0

Views: 463

Answers (1)

Gordon
Gordon

Reputation: 316969

After you clarfied in chat that the returned value of getSomething holds a dependency that is

a protected property of the abstract class, and it is injected into that abstract via another public method of the abstract

the solution is inject a mock of that dependency via that other method.

In general, you should never have the need to mock or stub behavior of the TestSubject. It is only when you are making lookups to the Global Scope or mix/hard code object creation into the TestSubject, that you might see the need for that, but these would be code smells and should be refactored instead. See Sebastian Bergmann's articles on untestable code:

Upvotes: 3

Related Questions