createMock(IVersionBackend::class); $backend->method('useBackendForStorage') ->willReturn($shouldUse); return $backend; } private function getStorage(string $class): IStorage { return $this->getMockBuilder($class) ->disableOriginalConstructor() ->setMethodsExcept(['instanceOfStorage']) ->getMock(); } public function testGetBackendSingle(): void { $manager = new VersionManager(); $backend = $this->getBackend(); $manager->registerBackend(IStorage::class, $backend); $this->assertEquals($backend, $manager->getBackendForStorage($this->getStorage(Local::class))); } public function testGetBackendMoreSpecific(): void { $manager = new VersionManager(); $backend1 = $this->getBackend(); $backend2 = $this->getBackend(); $manager->registerBackend(IStorage::class, $backend1); $manager->registerBackend(Local::class, $backend2); $this->assertEquals($backend2, $manager->getBackendForStorage($this->getStorage(Local::class))); } public function testGetBackendNoUse(): void { $manager = new VersionManager(); $backend1 = $this->getBackend(); $backend2 = $this->getBackend(false); $manager->registerBackend(IStorage::class, $backend1); $manager->registerBackend(Local::class, $backend2); $this->assertEquals($backend1, $manager->getBackendForStorage($this->getStorage(Local::class))); } public function testGetBackendMultiple(): void { $manager = new VersionManager(); $backend1 = $this->getBackend(); $backend2 = $this->getBackend(false); $backend3 = $this->getBackend(); $manager->registerBackend(IStorage::class, $backend1); $manager->registerBackend(Local::class, $backend2); $manager->registerBackend(Local::class, $backend3); $this->assertEquals($backend3, $manager->getBackendForStorage($this->getStorage(Local::class))); } }