@Test
  public void testInstantiation() {
    BlobId blobId =
        new BlobId(routerConfig.routerBlobidCurrentVersion, BlobId.BlobIdType.NATIVE, ClusterMap.UNKNOWN_DATACENTER_ID,
            Utils.getRandomShort(random), Utils.getRandomShort(random),
            mockClusterMap.getWritablePartitionIds(MockClusterMap.DEFAULT_PARTITION_CLASS).get(0), false,
            BlobId.BlobDataType.DATACHUNK);
    Callback<GetBlobResult> getOperationCallback = (result, exception) -> {
      // no op.
    };

    // test a good case
    GetBlobInfoOperation op =
        new GetBlobInfoOperation(routerConfig, routerMetrics, mockClusterMap, responseHandler, blobId, options,
            getOperationCallback, routerCallback, kms, cryptoService, cryptoJobHandler, time, false,
            quotaChargeCallback, router);
    Assert.assertEquals("Callback must match", getOperationCallback, op.getCallback());
    Assert.assertEquals("Blob ids must match", blobId.getID(), op.getBlobIdStr());

    // test the case where the tracker type is bad
    Properties properties = getNonBlockingRouterProperties(true);
    properties.setProperty("router.get.operation.tracker.type", "NonExistentTracker");
    RouterConfig badConfig = new RouterConfig(new VerifiableProperties(properties));
    try {
      new GetBlobInfoOperation(badConfig, routerMetrics, mockClusterMap, responseHandler, blobId, options,
          getOperationCallback, routerCallback, kms, cryptoService, cryptoJobHandler, time, false, quotaChargeCallback,
          router);
      Assert.fail("Instantiation of GetBlobInfoOperation with an invalid tracker type must fail");
    } catch (IllegalArgumentException e) {
      // expected. Nothing to do.
    }
  }
Test {@link GetBlobInfoOperation} instantiation and validate the get methods.
ambry-router/src/test/java/com/github/ambry/router/GetBlobInfoOperationTest.java