Mocking a third-party class binds the test to that class’s current signature, so an upgrade changing a method leaves the test passing against a shape that no longer exists — the mock does not know the real class changed.
// binds to their class, and silently drifts
$client = $this->createMock(VendorApiClient::class);
// bind to your interface; one thin adapter wraps theirs
interface StockFeed { public function levelFor(string $sku): ?int; }
$feed = $this->createMock(StockFeed::class);
The adapter is the only thing that touches the vendor class, and it is covered by one integration test that actually calls it. Everything else mocks an interface you control, which cannot drift. This is the anti-corruption layer argument arriving from the direction of testing, and it is usually the more persuasive one.