我正在编写一个 PHPUnit 测试,我需要在其中模拟一些依赖项,但我需要一些方法才能让它仍然像以前一样工作。即,我有:
class Dependency {
// some stuff not important for the test
public function thisOneINeed() {
/// complex code
}
// some more stuff
}
所以我在做这样的事情:
// prepare mock object
$dep = $this->getMockBuilder('Dependency')->disableOriginalConstructor()->getMock();
// mock out some other method that should return fixed value
$dep->expects($this->any())->method("shouldGetTrue")->will($this->returnValue(true));
// run test code, it will use thisOneINeed() and shouldGetTrue()
$result = $testSubject->runSomeCode($dep);
$this->assertEquals($expected, $result);
一切都很好,除了方法thisOneINeed()
被模拟出来,所以我没有运行复杂的代码,我需要它运行runSomeCode()
才能正常工作。该代码 thisOneINeed()
不调用任何其他方法,但它是正确测试所必需的,并且它不返回固定值,所以我不能只将静态 returnValue() 放在那里。而且AFAIK PHPunit没有像returnValue()
“调用父级”这样的方法。据我所知,它有returnCallback()
但没有办法告诉它“为父类调用此方法”。
我可以列出所有方法的列表Dependency
,从中删除thisOneINeed
并在构建模拟时将其传递给setMethods()
,但我不喜欢这种方法,看起来很笨拙。
我也可以这样做:
class MockDependency extends Dependency
{
// do not let the mock kill thisOneINeed function
final public function thisOneINeed()
{
return parent::thisOneINeed();
}
}
然后用于MockDependency
构建模拟对象,这也可以,但我不喜欢手动进行模拟。
那么有没有更好的方法来做到这一点?