createStub(GenerateContentResponse::class); $responseMock->method('text') ->willReturn('This is a friendly update.'); // Mock the model $modelMock = $this->createMock(GenerativeModel::class); $modelMock->expects($this->once()) ->method('generateContent') ->with($this->isInstanceOf(TextPart::class)) ->willReturn($responseMock); // Mock the client $clientMock = $this->createMock(Client::class); $clientMock->expects($this->once()) ->method('withV1BetaVersion') ->willReturnSelf(); $clientMock->expects($this->once()) ->method('generativeModel') ->with('gemini-3-pro-preview') ->willReturn($modelMock); // Instantiate GeminiClient with mocked Client $geminiClient = new GeminiClient('fake-api-key', $clientMock); $result = $geminiClient->generateFriendlyMessage('Raw technical message'); $this->assertEquals('This is a friendly update.', $result); } public function testGenerateFriendlyMessageException(): void { // Mock the client to throw an exception $clientMock = $this->createStub(Client::class); $clientMock->method('withV1BetaVersion') ->willThrowException(new \Exception('API Error')); // Instantiate GeminiClient with mocked Client $geminiClient = new GeminiClient('fake-api-key', $clientMock); $result = $geminiClient->generateFriendlyMessage('Raw technical message'); $this->assertNull($result); } }