PHPUnit:模拟 ZendFramework2 Controller 中除一个函数之外的所有函数

PHPUnit: mock all functions except one in ZendFramework2 Controller

我需要模拟一个 zf2 控制器并保留一个真实的功能:"getStopWords"。
我试过 this answer 改编如下:

public function createMockExecpt()
{
    // create mock to get names of all functions
    $mock = $this->getMockBuilder('Controller\CollectionsController')->disableOriginalConstructor()->getMock();
    $reflection = new MyReflectionClass($mock);
    $functionsToMock = $reflection->getAllfunctionNamesExcept(["getStopWords"]);

    // create mock but don't mock one function
    return $this->getMock('Controller\CollectionsController', $functionsToMock);
}

但在重新定义 class 时遇到错误。

// Cannot redeclare Mock_CollectionsController_d61a5651::__clone()

我认为发生这种情况是因为我需要一个控制器实例来找出它具有的所有功能。但是我不能在这种情况下创建控制器的实例,这就是我需要模拟的原因。但是我不能在同一个测试中模拟多个 class,所以我被卡住了。

我的问题是我认为您需要一个 class 的实例来获取所有方法。
结果你只需要 class 名字!

public function testGetStopWords()
{
    // get the class methods the controller has, except getStopWords
    $methodsToMock = array_diff(
        get_class_methods("Controller\CollectionsController"), 
        ["getStopWords"]
    );

    // use setMethods to determine which methods to mock
    $mockController = $this->getMockBuilder("Controller\CollectionsController")
            ->setMethods($methodsToMock)
            ->disableOriginalConstructor()
            ->getMock();
}