В качестве дополнения я хотел прикрепить expects()
вызовы к моему максируемому объекту, а затем вызвать конструктор. В PHPUnit 3.7.14 объект, который возвращается при вызове disableOriginalConstructor()
, буквально является объектом.
// Use a trick to create a new object of a class
// without invoking its constructor.
$object = unserialize(
sprintf('O:%d:"%s":0:{}', strlen($className), $className)
К сожалению, в PHP 5.4 есть новая опция, которую они не используют:
ReflectionClass :: newInstanceWithoutConstructor
Поскольку это было недоступно, мне пришлось вручную отразить класс, а затем вызвать конструктор.
$mock = $this->getMockBuilder('class_name')
->disableOriginalConstructor()
->getMock();
$mock->expect($this->once())
->method('functionCallFromConstructor')
->with($this->equalTo('someValue'));
$reflectedClass = new ReflectionClass('class_name');
$constructor = $reflectedClass->getConstructor();
$constructor->invoke($mock);
Обратите внимание, что если functionCallFromConstruct
равно protected
, вам специально нужно использовать setMethods()
, чтобы защищенный метод был поддельным Пример:
$mock->setMethods(array('functionCallFromConstructor'));
setMethods()
необходимо вызвать до вызова expect()
. Лично я цепью это после disableOriginalConstructor()
, но до getMock()
.