@Override
  protected BlobServiceAsyncClient buildBlobServiceAsyncClient(HttpClient httpClient, Configuration configuration,
      RequestRetryOptions retryOptions, AzureCloudConfig azureCloudConfig)
      throws MalformedURLException, InterruptedException, ExecutionException {
    if (accessTokenRef == null) {
      // This means the token is not yet created because we are building storage client for the first time from
      //base class's constructor. Create token before building storage client.
      refreshToken();
    }
    return new BlobServiceClientBuilder().credential(request -> Mono.just(accessTokenRef.get()))
        .endpoint(storageAccountInfo() != null ? storageAccountInfo().getStorageEndpoint() : azureCloudConfig.azureStorageEndpoint)
        .httpClient(httpClient)
        .retryOptions(retryOptions)
        .configuration(configuration)
        .buildAsyncClient();
  }
Constructor for {@link ADAuthBasedStorageClient} object for testing.
@param blobServiceAsyncClient {@link BlobServiceAsyncClient} object.
@param blobBatchAsyncClient {@link BlobBatchAsyncClient} object.
@param azureMetrics {@link AzureMetrics} object.
@param blobLayoutStrategy {@link AzureBlobLayoutStrategy} object.
@param azureCloudConfig {@link AzureCloudConfig} object.
@param accessToken {@link AccessToken} object.
ambry-cloud/src/main/java/com/github/ambry/cloud/azure/ADAuthBasedStorageClient.java