测试时模拟 Gradle 插件使用的 class

mocking a class used by a Gradle plugin when testing

我正在编写一个 Gradle 与外部 HTTP API 交互的插件。此交互由单个 class(我们称之为 ApiClient)处理。我正在编写一些使用 Gradle TestKit 来模拟使用该插件的整个构建的高级测试,但我显然不希望它们实际达到 API。相反,我想模拟 ApiClient 并检查其方法是否已使用适当的参数调用,但我不确定如何将模拟版本实际注入插件。该插件在 Gradle 深处的某处实例化,并使用其 void apply(Project project) 方法应用于正在执行的项目,因此似乎没有办法注入 MockApiClient 对象。

也许一种方法是手动实例化一个 Projectapply() 插件(此时,我 可以 注入模拟对象,因为我可以控制插件实例化),然后以编程方式在项目上执行任务,但我该怎么做呢?我已经阅读了 Gradle API 文档,但没有看到明显的方法。

最坏的解决方案是通过插件扩展配置传入一个 debug 标志,然后插件将使用该标志来确定它应该使用真实的 ApiClient 还是模拟(这会将一些易于 grep 的消息打印到 STDOUT)。但是,这并不理想,因为它比检查实际传递给 ApiClient 方法的参数更加模糊。

或许您可以将您的插件分成几个不同的插件

  • my-plugin-common - 所有常见的东西
  • my-plugin-real-services - 将 "real" 服务添加到模型(例如 RealApiClient)
  • my-plugin-mock-services - 向模型添加 "mock" 服务(例如 MockApiClient)
  • my-plugin - 适用 my-plugin-real-servicesmy-plugin-common
  • my-plugin-mock - 适用 my-plugin-mock-servicesmy-plugin-common

在现实世界中,人们永远只会apply: 'my-plugin'

要进行测试,您可以 apply: 'my-plugin-mock'