composer本身不提供mock服务,仅安装php测试依赖;mock是测试中动态生成的替代对象,非独立进程或http服务,需通过phpunit或prophecy等库在代码中手动创建和管理。

Composer 本身不提供 Mock 服务,也不能直接管理“Mock 服务”这种运行时组件——它只管 PHP 依赖的安装、自动加载和版本锁定。想在测试环境用 Mock,得靠 PHPUnit + PHPUnit\Framework\MockObject\MockBuilder 或 prophecy 这类库,而不是靠 Composer “启动服务”。
为什么不能把 Mock 当 Composer 包来“启停”?
Mock 是测试代码中动态生成的替代对象(stub/spy/mock),不是独立进程或 HTTP 服务。你不会运行 composer require mock-server,也不会执行 php artisan serve:mock——那属于对“Mock”概念的误解。
-
composer require --dev phpunit/phpunit是必须的,它是 Mock 能力的基础载体 -
composer require --dev prophecy/php-prophet可选,提供更声明式的 Mock 写法 - 所谓“Mock 服务”,如果真指一个外部 HTTP 模拟服务(如 WireMock、Mockoon),那它和 Composer 完全无关:你要手动部署、配置 host/port,再在测试里用
guzzlehttp/guzzle去调它
测试环境下该装哪些 Composer 包才真正有用?
重点不是“Mock 包”,而是让 Mock 写得安全、可维护、不污染生产依赖:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须加
--dev:所有测试相关包只能出现在require-dev里,否则上线会多出不必要的 autoload 和内存开销 - 推荐组合:
phpunit/phpunit(含原生 MockBuilder)+phpspec/prophecy(语义更清晰)+mikey179/vfsstream(Mock 文件系统,避免真实 I/O) - 警惕
laravel/sail或docker-compose.yml里硬编码的“mock-service”服务:它和 Composer 无关,但容易让人误以为是 Composer 管理的“依赖”
常见错误:把接口桩(stub)写成全局 Composer 包
有人试图把一组 HTTP 接口返回 JSON 封装成 Composer 包(比如 acme/api-stubs),然后 require 进项目——这会导致:
- 测试数据被当成生产依赖加载,
autoload里混入大量 JSON 文件路径,拖慢所有请求 - 不同测试用例需要不同响应,但包里只有一套固定 JSON,无法动态控制状态码或延迟
- 升级包即覆盖所有桩,破坏测试隔离性;而真正的 Mock 应该 per-test 或 per-method 创建
正确做法:用 file_get_contents(__DIR__ . '/stubs/user.json') 加载本地 fixture,或用 HttpMock 类封装可配置的响应规则——这些都该放在 tests/ 目录下,不走 Composer autoload。
Mock 的核心在于“控制边界”,不是“引入新服务”。Composer 只帮你装好武器(PHPUnit),怎么瞄准、开几枪、打完擦枪,得靠测试代码自己写清楚——尤其注意 getMockForAbstractClass() 和 createMock() 的行为差异,以及 willReturn() 与 willReturnOnConsecutiveCalls() 的调用时机陷阱。










