ProductService::getByUpc() expects a single entity like the getById() call but it receives a collection.
This solves the issue:
/**
* {@inheritdoc}
*/
public function getByUpc($upc)
{
$this->guardString($upc);
$collection = $this->getEntityCollection('items', ['upc' => $upc], self::COLLECTION_KEY);
return $collection->getFirst();
}