getMockBuilder(PersonRepository::class) ->disableOriginalConstructor() ->getMock(); $denormalizer = new PersonJsonReadDenormalizer($repository); $data = [ 'type' => 'person', 'id' => 123, ]; self::assertTrue($denormalizer->supportsDenormalization($data, Person::class)); } public function testSupportsDenormalizationReturnsFalseForInvalidData(): void { $repository = $this->getMockBuilder(PersonRepository::class) ->disableOriginalConstructor() ->getMock(); $denormalizer = new PersonJsonReadDenormalizer($repository); // not an array self::assertFalse($denormalizer->supportsDenormalization('not-an-array', Person::class)); // missing type self::assertFalse($denormalizer->supportsDenormalization(['id' => 1], Person::class)); // wrong type value self::assertFalse($denormalizer->supportsDenormalization(['type' => 'not-person', 'id' => 1], Person::class)); // missing id self::assertFalse($denormalizer->supportsDenormalization(['type' => 'person'], Person::class)); // wrong target class self::assertFalse($denormalizer->supportsDenormalization(['type' => 'person', 'id' => 1], \stdClass::class)); } public function testDenormalizeReturnsPersonFromRepository(): void { $person = new Person(); $repository = $this->getMockBuilder(PersonRepository::class) ->disableOriginalConstructor() ->onlyMethods(['find']) ->getMock(); $repository->expects(self::once()) ->method('find') ->with(123) ->willReturn($person); $denormalizer = new PersonJsonReadDenormalizer($repository); $result = $denormalizer->denormalize(['id' => 123], Person::class); self::assertSame($person, $result); } }