PHPUnit 9 - 模拟void方法

6
我刚把phpunit 7.5.20升级到phpunit 9.5.0,遇到了很多错误(实际上是好的),但不确定如何解决其中的某些错误。 只是想寻找一些修复以下错误的想法: Method setDummyStuff may not return value of type NULL, its return declaration is "void" 只有在创建一个createConfiguredMock()并将一个null方法作为参数传递时才会出现这种情况。
这是我的测试:
<?php


use Lib\IDummyCode;

class DummyTest extends PHPUnit\Framework\TestCase
{
    public function setUp(): void
    {
        parent::setUp();
    }

    public function testDummyThatReturnsVoid()
    {
        $this->createConfiguredMock(IDummyCode::class, [
            'setDummyStuff' => null
        ]);
    }
}

这里是一个虚拟类的示例:

<?php


namespace Lib;

interface IDummyCode
{
    public function setDummyStuff(
        int $testInt,
        string $testString
    ): void;
}

你们有没有关于如何改进这个的想法? 非常感谢!

1个回答

8
createConfiguredMock 的第二个参数是一个关联数组,其中键是要模拟的方法,值是该方法应返回的值。由于 setDummyStuff 方法无法返回任何内容(void 返回类型),因此定义返回值没有意义。这与特定的 null 值无关。它将与任何值一起失败。

因此,您可以忽略该方法:

$mock = $this->createConfiguredMock(IDummyCode::class, []);

这段话也可以更好地书写:

$mock = $this->createStub(IDummyCode::class);

如果您需要验证是否已调用 setDummyStuff,则必须设置一个期望。
$mock = $this->createMock(IDummyCode::class);
$mock->expects(self::once())
     ->method('setDummyStuff')
     ->with(123, 'Hello');

太棒了@PhilipWeinke!你解决了我的问题。我正在重构/升级整个测试套件,发现我在许多测试中都使用了我描述的方法:( 这是一个很好的机会来修复测试,并重新教育其他开发人员如何处理void方法。再次感谢。 - Everton Wcks
我很高兴能够帮助。 - Philip Weinke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接