升级PHPUnit9.5.10后Guzzle模拟响应getBody返回字符串报类型错误
报错根因
你使用的guzzlehttp/psr7 2.1.0版本严格遵循PSR-7规范,GuzzleHttp\Psr7\Response::getBody()方法的返回值强制声明为Psr\Http\Message\StreamInterface接口实例,你之前测试代码中直接模拟该方法返回JSON字符串的写法不符合接口类型约束,升级PHPUnit 9.x后严格的返回值类型校验触发了报错。
你的业务代码$data = json_decode($response->getBody());无需修改,因为StreamInterface实现了__toString()方法,直接传入字符串处理函数时会自动转换为响应体字符串。
解决方案
选择以下任意一种方式修改测试代码即可:
- 直接用Guzzle官方提供的工具类将字符串转为符合要求的Stream实例,这是最推荐的写法:
// 引入工具类 use GuzzleHttp\Psr7\Utils; // 模拟getBody方法返回Stream实例,替换原有直接返回字符串的写法 $mockResponse->method('getBody') ->willReturn(Utils::streamFor(json_encode(['your' => 'response data'])));
- 单独模拟StreamInterface对象适配旧写法:
// 先构造模拟的Stream对象 $mockStream = $this->createMock(\Psr\Http\Message\StreamInterface::class); $mockStream->method('__toString')->willReturn(json_encode(['your' => 'response data'])); // 让getBody返回模拟的Stream对象 $mockResponse->method('getBody')->willReturn($mockStream);
- 如果你使用Guzzle自带的MockHandler做测试桩,直接传入原生Response对象即可,内部会自动处理响应体转换:
use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; use GuzzleHttp\Psr7\Response; $mockHandler = new MockHandler([ // 第三个参数直接传入响应内容字符串,无需手动转Stream new Response(200, [], json_encode(['your' => 'response data'])) ]); $client = new Client([ 'handler' => HandlerStack::create($mockHandler) ]);
内容的提问来源于stack exchange,提问作者crmpicco
相关产品推荐
相关产品推荐

