I have an abstract class which makes calls to public functions in its constructor. To test these calls are executed correctly, I have to mock the abstract class. Whenever I do this, I cannot make public function calls in the constructor. I get the the following error: BadMethodCallException: Method ::setData() does not exist on this mock object
. The following code probably explains my issue better.
<?php
namespace Example\Tests;
use Mockery as m;
use PHPUnit_Framework_TestCase;
abstract class Foo
{
private $data;
public function __construct(array $defaults)
{
foreach ($defaults as $key => $value) {
$this->setData($key, $value);
}
}
public function getData()
{
return $this->data;
}
public function setData($key, $value)
{
return $this->data[$key] = $value;
}
}
class ExampleTest extends PHPUnit_Framework_TestCase
{
public function testDefaultsAreAssignedToData()
{
$expected = ['foo' => 'bar'];
$foo = m::mock('\Example\Tests\Foo', [$expected]);
$this->assertEquals($expected, $foo->getData());
}
}