PHPUnit:模拟不存在的类

时间:2015-01-24 12:27:43

标签: unit-testing mocking phpunit

是否可以在PHPUnit中创建一个不存在的类的模拟?
假设我有一些类创建另一个类的实例,例如:

class TaskRunner
{
    public function runTasks()
    {
        // Run through some loop to get tasks and store each in $taskName
        // Get task instance by given task name 
        $task = $this->getTaskInstance($taskName);
        if ($task instanceof AbstractTask) {
            $task->run();
        }
    }

    protected function getTaskInstance($taskName)
    {
        // Just an example
        return new $taskName();
    }
}

我想对runTasks方法运行单元测试,以检查创建的任务实例是否扩展了一些抽象类。
是否有可能不在文件系统中创建样本类来检查继承约束?
谢谢大家!

2 个答案:

答案 0 :(得分:31)

是的,可以存根/模拟PHPUnit不存在的类。只需执行$this->getMockBuilder('NameOfClass')->setMethods(array('foo'))->getMock();即可创建一个不存在的类NameOfClass的对象,该对象提供一种方法foo(),可以像往常一样使用API​​进行配置。

答案 1 :(得分:0)

接受的答案是完美的,除了自 PHPUNIT 9 以来存在一个问题,如果您需要模拟需要属于某个实例的类。在这种情况下,不能使用 \stdclass::class

并使用 $this->getMockBuilder('UnexistentClass')->addMethods(['foo'])->getMock(); 将导致 Class UnexistentClass does not exist,因为 addMethod 根据给定的类方法检查给定的方法。

如果其他人有同样的问题,幸运的是 setMethods 仍然有效,所以这在 phpunit 9 中仍然有效

$this->getMockBuilder('UnexistentClass')->setMethods(['foo'])->getMock();

(注意 setMethods 将在 phpunit 10 中删除)

希望届时能解决此问题。例如检查allowMockingUnknownTypes 是否设置为true。如果实施了该检查,这也将起作用:

$this->getMockBuilder('UnexistentClass')->allowMockingUnknownTypes()
->addMethods(['foo'])->getMock();