我想测试一个实例化另一个对象的类的方法 并调用此对象的方法。
如何在不依赖注入的情况下模拟此对象及其方法Foo2
和run()
?
这是可能的还是我需要修改Foo类的代码来注入对象?
class Foo {
public function bar()
{
$foo2 = new Foo2();
$data = $foo2->run();
}
}
答案 0 :(得分:2)
我最近在Mockery(PHP的模拟对象框架)called Mocking Hard Dependencies (new Keyword)中找到了一个很好的功能,它允许你重载/模拟在方法中实例化的类。例如:
use Mockery as m;
class BarTest extends \PHPUnit_Framework_TestCase
{
public function testBar()
{
$param = 'Testing';
$externalMock = m::mock('overload:Foo\Bar2');
$externalMock->shouldReceive('run')
->once()
->andReturn('Tested!');
$foo = new Foo();
$foo->bar();
}
}
希望这个帮助
答案 1 :(得分:1)
使用phpunit的模拟工具:
但是,您应该考虑将bar()方法逻辑拆分为两个单独的方法来拆分实例化和执行,例如:
bar() {
$foo2 = $this->getFooImplementation();
$data = $foo2->run();
}
然后您可以模拟getFooImplementation()的调用:
$fooInstance = $this->getMockBuilder('Foo')->setMethods(array('getFooImplementation'))->getMock();
$fooInstance->expects($this->at(0))->method('getFooImplementation')->willReturn(new Foo3());