如何使用 Google Drive API(Java 客户端)对应用程序进行单元测试

Posted

技术标签:

【中文标题】如何使用 Google Drive API(Java 客户端)对应用程序进行单元测试【英文标题】:How to unit test an application using Google Drive API (Java client) 【发布时间】:2012-11-18 19:10:46 【问题描述】:

使用Google Drive API (Java client) 对应用程序进行单元测试的最佳方法是什么?

似乎编写的应用程序严重依赖 Drive 类,但两者都没有......

创建一个非常广泛的模拟(它本身可能需要 进行测试),或 根据实际 Drive 服务编写集成测试

...如何测试这样的应用程序?

使用像 Mockito 这样的模拟框架对 Drive API(Java 客户端)来说有点乏味,因为 Drive Java 客户端的使用依赖于进行如此多的链式调用(例如,来自文档):

Drive service = getDriveService(req, resp);
service.files().get(fileId).execute();

【问题讨论】:

我想说你最好在这种情况下进行集成测试,因为你不能轻易地模拟库。 【参考方案1】:

事实上,在深度存根的帮助下,在 Mockito 中它不应该那么乏味:

Drive mockDrive = mock(Drive.class, RETURNS_DEEP_STUBS);

....
// stubbing
when(service.files().get(anyString()).execute()).thenReturn(something);

// verify
verify(service.files().get("Some Field ID").execute();

通过documentation of Mockito了解更多信息

如果您编写集成测试来测试实际的 Drive 服务也可以,但它根本无法替代单元测试。

【讨论】:

+1 如果我想在晚上睡得很香,我会进行单元测试和集成测试。 仍然无法让它工作,因为我得到了ClassCastException (org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$4603175d cannot be cast to java.lang.Void)。但是,我认为您的答案实际上是正确的,而我看到的错误是 Mockito 中的错误。谢谢! @JonathanNewmuis 我遇到了同样的问题。你找到解决方案了吗? @Jeffrey 我已经有一段时间没有从事这个项目了,但是不,我认为我没有找到解决方案。 @JonathanNewmuis 我昨天发现了问题:Mockito 对泛型不是很聪明。 execute() 返回T。 Mockito 不解析类型变量,因此它模拟 Object 而不是真正的类。你可以使用 Guava TypeToken 写一个新的Answer 来解决这个问题,但是有点乱。

以上是关于如何使用 Google Drive API(Java 客户端)对应用程序进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 如何使用 Google Drive API 下载公共文件

如何使用 Google Drive API 获取父文件夹?

如何通过 API 向 Google Drive 添加/创建/插入文件?

如何从 Google Drive 上传和下载文件(使用 Rest Api v3)

如何避免使用 google drive api 和 pydrive 的身份验证页面

如何使用 Google Drive API(Java 客户端)对应用程序进行单元测试