$ backupGlobals вам не поможет, потому что эта ошибка происходит из других источников. PHPUnit 3.5.2 (возможно, и более ранние версии) имеет следующий код в PHPUnit / Framework / MockObject / Generator.php
if ($callOriginalConstructor &&
!interface_exists($originalClassName, $callAutoload)) {
if (count($arguments) == 0) {
$mockObject = new $mock['mockClassName'];
} else {
$mockClass = new ReflectionClass($mock['mockClassName']);
$mockObject = $mockClass->newInstanceArgs($arguments);
}
} else {
// Use a trick to create a new object of a class
// without invoking its constructor.
$mockObject = unserialize(
sprintf(
'O:%d:"%s":0:{}',
strlen($mock['mockClassName']), $mock['mockClassName']
)
);
}
Этот "трюк" с unserialize используется, когда вы просите getMock не выполнять исходный конструктор, и он быстро завершится с PDO.
Итак, как обойти это?
Один из вариантов - создать помощника по тестированию, подобного этому
class mockPDO extends PDO
{
public function __construct ()
{}
}
Цель здесь - избавиться от оригинального конструктора PDO, который вам не нужен. Затем измените свой тестовый код на это:
$pdoMock = $this->getMock('mockPDO', array('prepare'));
Создание подобного макета будет выполнять оригинальный конструктор, но, поскольку благодаря помощнику по тестированию mockPDO он теперь безвреден, вы можете продолжить тестирование.