如何正确使用phpunit中的“setMockClassName”和类字符串?

How to use `setMockClassName` from phpunit with a class-string correctly?

提问人:Chubby Cows 提问时间:11/9/2023 最后编辑:Chubby Cows 更新时间:11/9/2023 访问量:32

问:

最近,PHPUnit 的维护者对“setMockClassName”方法进行了更改,使其现在只接受类字符串而不是常规字符串。我目前正在我正在处理的代码库中处理此维护,但我正在努力正确实现这些更改。一些同事建议使用匿名课程(这也是我最初的直觉),所以我尝试了以下方法:

public function testSomeMethod(): void
{
    $anonymousClass = new class() {
    };

    $mock = $this->getMockBuilder(MockClass::class)
        ->setMockClassName($anonymousClass::class)
        ->getMock();

    // Test assertions go here
}

但是,这会导致被抛出。ClassAlreadyExistsException

因此,我决定定义一个单独的类并将其用作类名:

// This class is in the same directory, in "DumbClass.php"
namespace Org\Project\Package\Tests;

class DumbClass {
}



// This code is in "MyClassTest.php"
namespace Org\Project\Package\Tests;

final class MyClassTest extends TestCase
{
    public function testSomeMethod(): void
    {
        $mock = $this->getMockBuilder(MockClass::class)
            ->setMockClassName(DumbClass::class)
            ->getMock();

        // Test assertions go here
    }
}

为了简单起见,我直接从供应商(vendor/bin/phpunit)运行,这个抛出一条消息,其中包含“ParseError:语法错误,意外的命名空间名称”My\Namespace\DumbC...“,需要标识符”

我尝试搜索各种论坛、PHPUnit 问题和 StackOverflow,但我没有发现其他人遇到同样的问题。我在这里做错了什么?

php phpunit

评论

0赞 Adi 11/9/2023
您的代码看起来不错,您是否检查过两个测试类是否都已正确自动加载?
0赞 Chubby Cows 11/9/2023
据我所知,这些类正在被正确地自动加载。此外,我还包含了第二个示例中的错误。
0赞 Adi 11/9/2023
您是否为模拟对象使用命名空间类?
0赞 Chubby Cows 11/9/2023
是的,测试和模拟对象也在同一个文件夹下
1赞 Kolyunya 11/9/2023
PHPUnit 被弃用,没有任何替换,许多模拟功能。我建议您考虑至少迁移到新测试。在我的设置中,PHPUnit 只是一个运行器,而是一个模拟引擎。MockeryMockery

答: 暂无答案