【问题标题】:Mocking azure blob storage in unit tests在单元测试中模拟 azure blob 存储
【发布时间】:2013-09-04 10:21:16
【问题描述】:

有没有我可以在不运行存储模拟器的情况下模拟 azure blob 存储?如果有人能对此有所了解,那将非常有帮助

【问题讨论】:

    标签: unit-testing azure mocking azure-storage azure-blob-storage


    【解决方案1】:

    存储库没有用于模拟的接口,所以如果你想真正模拟出来,我认为你有两个选择:

    1. 自己创建一个接口,并将与存储库的交互隐藏在自己的类后面。然后使用您的界面进行模拟测试。这是我过去做过很多的事情,试图将存储库的使用从应用程序的其余部分中抽象出来。当然,你可以在自己的代码中做这个抽象,或者存储库在 GitHub 上。您可以分叉它并开始添加接口以使模拟更容易。我认为您只需在自己的代码中创建一个接口和一个具体的实现来完成与存储子系统交互以针对您的场景特定的事物进行必要的工作。

    2. 使用能够拦截的模拟框架,并且可以模拟出没有接口的类型。类似 TypeMock 的东西。还有其他的,免费的和商业的。

    【讨论】:

    • 感谢您的回答,但问题是有某些代码创建了一个 blob 容器,然后将文件上传到 blob。无论如何我可以为这些方法编写单元测试吗?
    • 如果您想针对实际存储库测试该细节,那么您应该查看 TypeMock 或 Microsoft Fakes,因为 user2746950 在另一个答案中指示。这些模拟框架应该能够让您拦截对实际存储库的调用。同样,您可以使用接口从应用中抽象出这种方式,并确保调用接口来完成工作。
    【解决方案2】:

    你可以使用 Microsoft fakes,它简单易用,是 typemock 的免费替代品

    【讨论】:

    • 它不是免费的,您需要 Visual Studio Enterprise 才能使用此功能
    【解决方案3】:

    如果你的类路径中有 Lombok,你可以很容易地模拟出最终的东西。只需从 azure blob 客户端类中提取所需的任何签名到接口,创建一个代理给真正的 azure 客户端的代理类,然后在我们的代码中使用该接口。通过这种方式,您可以创建接口的模拟,并拥有一些不会干扰代码覆盖率的胶水代码,因为 lombok 将代码标记为 @Generated。

    方法如下:

    public interface AzureStorage {
    
      Mono<Boolean> exists();
        
      Mono<Void> delete();
    
      Mono<Response<BlockBlobItem>> uploadWithResponse(BlobParallelUploadOptions options);
    
      Mono<BlobDownloadAsyncResponse> downloadWithResponse(BlobRange range, DownloadRetryOptions options,
            BlobRequestConditions requestConditions, boolean getRangeContentMd5);
    }
    

    这些是我们在项目中使用的方法。这是一个实现接口并将所有内容委托给真正的 azure blob 客户端的类:

    @lombok.Value
    static class AzureStorageDelegate implements AzureStorage {
    
        @Delegate
        BlobAsyncClient client;
    
    }
    

    现在您可以使用 Mockito 模拟 AzureStorageDelegate 或在任何您认为合适的地方注入模拟 AzureStorage。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-08
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      相关资源
      最近更新 更多