phpunit 提供了 `self::identicalto()` 断言约束器,可替代自定义回调,实现对 mock 方法参数的严格引用相等(`===`)校验,确保传入的是同一对象实例而非仅值相等的对象。
在使用 PHPUnit 进行单元测试时,Mock 对象的参数验证是保障测试可靠性的关键环节。默认情况下,$mock->with($expected) 使用的是“值相等”(== 或对象属性比较)逻辑,这在面对对象实例时容易产生误判——例如,两个内容相同但不同内存地址的 Hosting 实例会被视为等价,导致本应失败的测试意外通过。
要强制执行严格引用比较(===),即要求传入参数必须是同一个对象实例,推荐使用 PHPUnit 内置的约束器 self::identicalTo():
$hosting = new Hosting();
$this->entityManager
->expec
ts($this->once())
->method('persist')
->with(self::identicalTo($hosting)); // ✅ 严格引用匹配
$this->persister->persist($hosting); // 测试通过若被测代码中错误地创建了新实例(如 ->persist(new Hosting())),该断言将立即失败,并清晰提示:
Failed asserting that two variables reference the same object.
✅ 优势对比:
⚠️ 注意事项:
? 延伸技巧:
PHPUnit 还提供其他实用约束器,例如:
善用这些约束器,能让 Mock 验证更精准、测试意图更清晰,大幅提升测试的可维护性与可靠性。