Я пишу тест 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()
не вызывает никаких других методов, но он необходим для правильной проверки и не возвращает фиксированное значение, поэтому я не могу просто поместить туда static returnValue(). И, насколько мне известно, в 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
для создания макета объекта, и это тоже работает, но мне не нравится создавать макет вручную.
Есть ли лучший способ сделать это?