unit-testing - PHPUnit:模拟不存在的类

标签 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 运行单元测试检查创建的任务实例是否扩展了一些抽象类的方法。
是否有可能不在文件系统中创建示例类来检查继承约束?
谢谢大家!

最佳答案

接受的答案是完美的,除了因为 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();

关于unit-testing - PHPUnit:模拟不存在的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28125444/

相关文章:

c - C 中的模拟库函数

PHPUnit\DBUnit\命名空间未定义

authentication - 验证测试失败,使用 Laravel、phpunit 和 Homestead

c# - 带有 UserManager 的 ASP.NET 5 单元测试 Controller

Python模拟,每次调用返回不同的值

objective-c - 如何在 Kiwi 中 stub 方法 block ?

Java 模拟 - 用模拟对象动态替换类

php - 通过终端在 linux 上安装旧版本 oh phpunit

unit-testing - 如何分析junit测试结果

python - 模拟父类 __init__ 方法