PHPUnit: имитировать все методы, кроме некоторых

Я пишу тест 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для создания макета объекта, и это тоже работает, но мне не нравится создавать макет вручную.

Есть ли лучший способ сделать это?

8
задан StasM 7 June 2012 в 01:06
поделиться