【发布时间】:2013-09-04 10:21:16
【问题描述】:
有没有我可以在不运行存储模拟器的情况下模拟 azure blob 存储?如果有人能对此有所了解,那将非常有帮助
【问题讨论】:
标签: unit-testing azure mocking azure-storage azure-blob-storage
有没有我可以在不运行存储模拟器的情况下模拟 azure blob 存储?如果有人能对此有所了解,那将非常有帮助
【问题讨论】:
标签: unit-testing azure mocking azure-storage azure-blob-storage
存储库没有用于模拟的接口,所以如果你想真正模拟出来,我认为你有两个选择:
自己创建一个接口,并将与存储库的交互隐藏在自己的类后面。然后使用您的界面进行模拟测试。这是我过去做过很多的事情,试图将存储库的使用从应用程序的其余部分中抽象出来。当然,你可以在自己的代码中做这个抽象,或者存储库在 GitHub 上。您可以分叉它并开始添加接口以使模拟更容易。我认为您只需在自己的代码中创建一个接口和一个具体的实现来完成与存储子系统交互以针对您的场景特定的事物进行必要的工作。
使用能够拦截的模拟框架,并且可以模拟出没有接口的类型。类似 TypeMock 的东西。还有其他的,免费的和商业的。
【讨论】:
你可以使用 Microsoft fakes,它简单易用,是 typemock 的免费替代品
【讨论】:
如果你的类路径中有 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。
【讨论】: