PHPUnit在模拟命名空间为空的类时发出警告

PHPUnit在模拟命名空间为空的类时发出警告,php,composer-php,autoloader,phpunit,Php,Composer Php,Autoloader,Phpunit,我的composer项目由src和tests文件夹组成。 src中的代码使用Composer psr4 autoloader自动加载,如下所示 "autoload": { "psr-4": { "christmas\\":"src/" } } 要测试的类看起来是这样的 namespace christmas; class Hello { //constructor & dependency injection included in real

我的composer项目由
src
tests
文件夹组成。
src
中的代码使用Composer psr4 autoloader自动加载,如下所示

    "autoload": {
    "psr-4": {
        "christmas\\":"src/"
    }
}
要测试的类看起来是这样的

namespace christmas;
class Hello
{   //constructor & dependency injection included in real class

public function sayHello()
{
    return "HELLO";
}
}
<?php
    use PHPUnit\Framework\TestCase;
    require_once('../vendor/autoload.php');
    use christmas\Hello;


    class TestHello extends TestCase
    {
        public function testSayHelloMethod()
        {
            $hello = $this->getMockBuilder('Hello')
                ->getMock();
            $hello->expects($this->once())
                ->method('sayHello')
                ->will($this->returnValue('HELLO'));

            $this->assertEquals(
                "HELLO",
                $hello->sayHello()
            );


        }
    }
最后,我的测试课看起来是这样的

namespace christmas;
class Hello
{   //constructor & dependency injection included in real class

public function sayHello()
{
    return "HELLO";
}
}
<?php
    use PHPUnit\Framework\TestCase;
    require_once('../vendor/autoload.php');
    use christmas\Hello;


    class TestHello extends TestCase
    {
        public function testSayHelloMethod()
        {
            $hello = $this->getMockBuilder('Hello')
                ->getMock();
            $hello->expects($this->once())
                ->method('sayHello')
                ->will($this->returnValue('HELLO'));

            $this->assertEquals(
                "HELLO",
                $hello->sayHello()
            );


        }
    }
phpunit回显以下输出

Time: 45 ms, Memory: 4.00 MB

    There was 1 warning:

    1) tests\Hello::testSayHelloMethod()
    Trying to configure method "sayHello" which cannot be configured because it does not exist, has not been specified, is final, or is static

    /usr/share/php/PHPUnit/TextUI/TestRunner.php:641
    /usr/share/php/PHPUnit/TextUI/Command.php:206
    /usr/share/php/PHPUnit/TextUI/Command.php:162

    WARNINGS!
    Tests: 1, Assertions: 0, Warnings: 1.
下面是我的代码如何组织的视图

    ├── composer.json
    ├── src
    │   └── Hello.php
    ├── tests
    │   └── TestHello.php
    └── vendor

我错过了什么?我需要一个没有任何警告的通过测试。

您需要将类的完整名称传递给模拟生成器,即
'christmas\Hello'
。由于需要将其作为字符串传递,因此仅使用“Hello”不足以正确标识该类

由于您已经为该类设置了
use
,因此可以使用
::class
获取全名。例如:

$hello = $this->getMockBuilder(Hello::class)
                ->getMock();

您需要将类的完整名称空间名称传递给模拟生成器,即
“christmas\Hello”
。由于需要将其作为字符串传递,因此仅使用“Hello”不足以正确标识该类

由于您已经为该类设置了
use
,因此可以使用
::class
获取全名。例如:

$hello = $this->getMockBuilder(Hello::class)
                ->getMock();

谢谢@Peter,添加完整的名称空间非常有效
christmas\Hello
Hello::class
也非常有效。谢谢谢谢@Peter,添加完整的名称空间非常有效
christmas\Hello
Hello::class
也非常有效。谢谢