模拟对象并保留其他方法的功能

Jür*_*aul 1 php phpunit mocking

比方说我有这个类:

class Foo {

    public function add($x, $y)
    {
        return $x + $y;
    }

    public function subtract($x, $y)
    {
        return $x - $y;
    }
}
Run Code Online (Sandbox Code Playgroud)

我只想改变add方法的行为:

$mock = $this->getMock('Foo');
$mock->expects($this->once())->method('add')->will($this->returnCallback(function ($x, $y) {
    return ($x + 0) + ($y + 0);
}));

$this->assertEquals(4, $mock->add(2,2));
$this->assertEquals(2, $mock->subtract(4,2));
Run Code Online (Sandbox Code Playgroud)

为什么我的减法方法现在返回null?我期待它表现平常.

Failed asserting that null matches expected 2.
Run Code Online (Sandbox Code Playgroud)

Fer*_*rCa 6

你需要做一个局部模拟,指定getMock你想要模拟的方法:

$mock = $this->getMock('Foo', array('add');
Run Code Online (Sandbox Code Playgroud)

这样只会模拟add方法,对象的其余部分就像往常一样.