setTmdbId(123) ->setTitle('Inception') ->setLtbxdRef('film/inception'); $tmdbGateway = $this->createMock(TMDBGateway::class); $tmdbGateway->method('getMovieCredits')->with(123)->willReturn( new MovieCreditsContext([ new TMDBMovieCredit( id: 42, name: 'Leonardo DiCaprio', popularity: 99.0, character: 'Cobb', ), ]), ); $actorRepository = new class implements ObjectRepository { public function findAll(): array { return []; } public function findBy(array $criteria, array|null $orderBy = null, int|null $limit = null, int|null $offset = null): array { return []; } public function findOneBy(array $criteria): ?object { return null; } public function getClassName(): string { return Actor::class; } }; $movieRoleRepository = new class implements ObjectRepository { public function findAll(): array { return []; } public function findBy(array $criteria, array|null $orderBy = null, int|null $limit = null, int|null $offset = null): array { return []; } public function findOneBy(array $criteria): ?object { return null; } public function getClassName(): string { return MovieRole::class; } public function count(array $criteria = []): int { return 0; } }; $persisted = []; $em = $this->createMock(EntityManagerInterface::class); $em->method('getRepository')->willReturnCallback( static fn (string $class): ObjectRepository => match ($class) { Actor::class => $actorRepository, MovieRole::class => $movieRoleRepository, default => throw new \InvalidArgumentException("Unexpected repository for {$class}"), }, ); $em->method('persist')->willReturnCallback(function (object $entity) use (&$persisted): void { $persisted[] = $entity; }); $syncer = new ActorSyncer($tmdbGateway, $em); $syncer->syncActorsForMovie($movie); self::assertCount(2, $persisted); self::assertInstanceOf(Actor::class, $persisted[0]); self::assertInstanceOf(MovieRole::class, $persisted[1]); self::assertCount(1, $movie->getActors()); $role = $movie->getActors()->first(); self::assertInstanceOf(MovieRole::class, $role); self::assertSame($movie, $role->getMovie()); self::assertSame($persisted[0], $role->getActor()); self::assertCount(1, $persisted[0]->getMovieRoles()); } }