I know that creating an instance of a Class
in the middle of a method
it's a bad practice since it makes code hard to test.
But I can't refactor the code, so I need to find a way to mock an Object
created with new
in the middle of a method
under test.
Used Frameworks: PHPUnit
, Mockery
, WP_Mock
Example: Here I need to mock the get_second_string()
method from the instance of the class ExternalClass
Class MyClass {
function methodUnderTest($string) {
$objToMock = new ExternalClass();
$second_string = $objToMock->get_second_string();
$final_string = $string . $second_string;
return $final_string;
}
}
Class TestMyClass extends PHPUnit_Framework_TestCase {
public function setUp() {
}
public function tearDown() {
}
public function test_methodUnderTest() {
$externalObject = $this->getMockBuilder('ExternalClass')
->setMethods(['get_second_string'])
->getMock;
$externalObject->expects($this->once())
->method('get_second_string')
->willReturn(' two');
$testObj = new MyClass();
$this->assertEquals('one two', $testObj->methodUnderTest('one');
}
}