phpunit 模拟返回 null,而原始方法返回字符串

4 php testing phpunit unit-testing

我有这个文件结构:

- module
-- phpunit.xml
-- blaat.php
-- tests
--- blaatTest.php
Run Code Online (Sandbox Code Playgroud)

blaat.php 的内容

class Blaat
{
    public function doSomething()
    {
        return 'my return value';
    }
}
Run Code Online (Sandbox Code Playgroud)

测试/blaatTest.php 的内容

use PHPUnit\Framework\TestCase;

require_once './blaat.php';

class blaatTest extends TestCase
{ 
    public function testCanBeCreatedFromValidEmailAddress(): void
    {
        $stub = $this->createMock(Blaat::class);

        $this->assertEquals('foo', $stub->doSomething());
    }
}
Run Code Online (Sandbox Code Playgroud)

phpunit.xml 的内容

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
        bootstrap="./tests/bootstrap.php">
    <testsuites>
        <testsuite name="unit">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
    <filter>
        <blacklist>
            <directory suffix=".php">vendor</directory>
        </blacklist>
    </filter>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

当我在终端中运行时phpunit(当我在modules文件夹中时)我得到以下信息:

PHPUnit 6.0.8 by Sebastian Bergmann and contributors.

F                                                     1 / 1 (100%)

Time: 427 ms, Memory: 22.00MB

There was 1 failure:

1) blaatTest::testCanBeCreatedFromValidEmailAddress
Failed asserting that null matches expected 'foo'.

/path/to/module/tests/blaatTest.php:19

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
Run Code Online (Sandbox Code Playgroud)

这怎么可能?我的方法将始终返回一个字符串,但 phpunit 说它得到一个空值作为返回。我在这里做错了什么?

Mat*_*teo 5

来自文档(第 9 章。测试替身)

默认情况下,原始类的所有方法都会替换为仅返回 null 的虚拟实现(不调用原始方法)。will($this->returnValue())例如,使用该方法,您可以将这些虚拟实现配置为在调用时返回一个值

所以这是默认行为,您需要自己进行检测。