如何有效、简洁和合法地为界面创建替身?

How to create a double for an interface, usefully, concisely and legally?

我想为接口创建一个测试替身。解决方案必须满足以下所有要求:

目前这在现代 PHPUnit (8+) 中是否可以实现,或者是否必须放宽上述某些要求?

TL;DR: 不要设置任何方法。

$mock = $this->getMockBuilder(MyInterface::class)->getMock();

// That's. Freakin. IT.

$mock->expects($this-any())
    ->method('whatever_but_present_in_interface')
    ->willReturnCallback(function(){ return "YISS!"; });

// It. Just. Works.

在 PHPUnit 世界中关于配置模拟的讨论如此之多,并且随着 PHPUnit 8 和 9 中用于配置模拟方法的 API 的大量增加,有人可能会认为“设置”方法的某些方式是强制性,这些 API 以某种方式“声明”了您想乱用的方法,如果您不“声明”它们,PHPUnit 不会让您乱用它们。

嗯,没有。