模拟没有依赖注入的方法的对象

时间:2016-06-15 09:36:54

标签: php unit-testing phpunit

我想测试一个实例化另一个对象的类的方法 并调用此对象的方法。

如何在不依赖注入的情况下模拟此对象及其方法Foo2run()

这是可能的还是我需要修改Foo类的代码来注入对象?

class Foo {

    public function bar()
    {
        $foo2 = new Foo2();
        $data = $foo2->run();
    }
}

2 个答案:

答案 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());