Как покрыть подобный метод юнит тестом?
Ведь если я укажу существующие сейчас clientId, и с ними пройдут юнит тесты, и когда то удалят эти clientId из БД, то юнит тесты зафейлятся
Юнит тесты ходят в реальную бд? Это неправильно.
Нужно заменять в тесте слой взаимодействия с бд заглушкой, которая будет возвращать нужные данные, либо для тестов своя бд, где перед тестом она заполняется нужными данными
Сделайте мок тестируемого сервиса, переопределите методы, которые находятся в тестируемом методе, но нет необходимости их тестировать, верните ожидаемое для тестового сценария значение:$serivceMock = $this->getMockBuilder(Service::class)
            ->setMethods(['read',])
            ->getMock();
$serviceMock->expects($this->once())
            ->method('read')
            ->willReturn($preparedResult);
$serviceMock->execute($clientId);
// there is checks about work with preparedResult
Или, например, при проверке ситуации с ненайденным пользователем$serivceMock = $this->getMockBuilder(Service::class)
            ->setMethods(['read',])
            ->getMock();
$serviceMock->expects($this->once())
            ->method('read')
            ->willThrowException(new NotFoundException());
$serviceMock->execute($clientId);
// there is checks about work with not found exception