Example of Mock / mockery in koel/koel

File tests/Unit/Services/ITunesServiceTest.php (link to Github)
use App\Services\ITunesService;
use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;
use Illuminate\Contracts\Cache\Repository as Cache;
use Illuminate\Log\Logger;
use Mockery;
use Tests\TestCase;

class ITunesServiceTest extends TestCase
{
    public function testConfiguration(): void
    {
        config(['koel.itunes.enabled' => true]);
        /** @var ITunesService $iTunes */
        $iTunes = app()->make(ITunesService::class);
        self::assertTrue($iTunes->used());

        config(['koel.itunes.enabled' => false]);
        self::assertFalse($iTunes->used());
    }

    /** @return array<mixed> */
    public function provideGetTrackUrlData(): array
    {
        return [
            [
                'Foo',
                'Bar',
                'Baz',
                'https://itunes.apple.com/bar',
                'https://itunes.apple.com/bar?at=foo',
                '2ce68c30758ed9496c72c36ff49c50b2',
            ], [
                'Foo',
                '',
                'Baz',
                'https://itunes.apple.com/bar?qux=qux',
                'https://itunes.apple.com/bar?qux=qux&at=foo',
                'cda57916eb80c2ee79b16e218bdb70d2',
            ],
        ];
    }

    /** @dataProvider provideGetTrackUrlData */
    public function testGetTrackUrl(
        string $term,
        string $album,
        string $artist,
        string $trackViewUrl,
        string $affiliateUrl,
        string $cacheKey
    ): void {
        config(['koel.itunes.affiliate_id' => 'foo']);

        $mock = new MockHandler([
            new Response(200, [], json_encode([
                'resultCount' => 1,
                'results' => [['trackViewUrl' => $trackViewUrl]],
            ])),
        ]);

        $client = new Client(['handler' => HandlerStack::create($mock)]);
        $cache = Mockery::mock(Cache::class);
        $logger = Mockery::mock(Logger::class);

        $service = new ITunesService($client, $cache, $logger);

        $cache
            ->shouldReceive('remember')
            ->with($cacheKey, 10080, Mockery::on(static function (callable $generator) use ($affiliateUrl): bool {
                return $generator() === $affiliateUrl;
            }));

        $service->getTrackUrl($term, $album, $artist);
    }
}

Additional resources on mock / mockery: