### Question:
AzureCloudDestination implements CloudDestination { @Override public void downloadBlob(BlobId blobId, OutputStream outputStream) throws CloudStorageException { try { azureBlobDataAccessor.downloadBlob(blobId, outputStream); } catch (Exception e) { throw toCloudStorageException("Error downloading blob " + blobId, e); } } AzureCloudDestination(CloudConfig cloudConfig, AzureCloudConfig azureCloudConfig, String clusterName,
      VcrMetrics vcrMetrics, AzureMetrics azureMetrics, AzureReplicationFeed.FeedType azureReplicationFeedType);   AzureCloudDestination(BlobServiceClient storageClient, BlobBatchClient blobBatchClient,
      AsyncDocumentClient asyncDocumentClient, String cosmosCollectionLink, String clusterName,
      AzureMetrics azureMetrics, AzureReplicationFeed.FeedType azureReplicationFeedType, boolean isVcr); @Override boolean uploadBlob(BlobId blobId, long inputLength, CloudBlobMetadata cloudBlobMetadata,
      InputStream blobInputStream); @Override void downloadBlob(BlobId blobId, OutputStream outputStream); @Override boolean deleteBlob(BlobId blobId, long deletionTime, short lifeVersion,
      CloudUpdateValidator cloudUpdateValidator); @Override short updateBlobExpiration(BlobId blobId, long expirationTime, CloudUpdateValidator cloudUpdateValidator); @Override short undeleteBlob(BlobId blobId, short lifeVersion, CloudUpdateValidator cloudUpdateValidator); @Override Map<String, CloudBlobMetadata> getBlobMetadata(List<BlobId> blobIds); @Override void close(); @Override void stopCompaction(); @Override FindResult findEntriesSince(String partitionPath, FindToken findToken, long maxTotalSizeOfEntries); @Override int compactPartition(String partitionPath); @Override void persistTokens(String partitionPath, String tokenFileName, InputStream inputStream); @Override boolean retrieveTokens(String partitionPath, String tokenFileName, OutputStream outputStream); int getQueryBatchSize();  }### Answer:
@Test public void testDownload() throws Exception { mockBlobExistence(true); downloadBlob(blobId); assertEquals(1, azureMetrics.blobDownloadRequestCount.getCount()); assertEquals(1, azureMetrics.blobDownloadSuccessCount.getCount()); assertEquals(0, azureMetrics.blobDownloadErrorCount.getCount()); assertEquals(1, azureMetrics.blobDownloadTime.getCount()); }
@Test public void testDownloadNotFound() throws Exception { BlobStorageException ex = mockStorageException(BlobErrorCode.BLOB_NOT_FOUND); doThrow(ex).when(mockBlockBlobClient).downloadWithResponse(any(), any(), any(), any(), anyBoolean(), any(), any()); expectCloudStorageException(() -> downloadBlob(blobId), BlobStorageException.class); verifyDownloadErrorMetrics(); }
@Test public void testDownloadBlobException() throws Exception { BlobStorageException ex = mockStorageException(BlobErrorCode.INTERNAL_ERROR); doThrow(ex).when(mockBlockBlobClient).downloadWithResponse(any(), any(), any(), any(), anyBoolean(), any(), any()); expectCloudStorageException(() -> downloadBlob(blobId), BlobStorageException.class); verifyDownloadErrorMetrics(); }