无论如何我可以在不运行存储模拟器的情况下模拟 azure blob 存储吗?如果有人能对此有所了解,那将有很大帮助
3 回答
存储库没有用于模拟的接口,所以如果你想真正模拟它,我认为你有两个选择:
自己创建一个接口,将与存储库的交互隐藏在自己的一个类后面。然后使用您的界面进行模拟测试。这是我过去经常做的事情,试图将存储库的使用从应用程序的其余部分中抽象出来。当然,你可以在自己的代码中做这个抽象,或者存储库在 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。