在测试时模拟Gradle插件使用的类

时间:2017-07-20 13:33:16

标签: unit-testing gradle mocking gradle-plugin

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

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

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

1 个答案:

答案 0 :(得分:1)

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

  • my-plugin-common - 所有常见的东西
  • my-plugin-real-services - 向模型添加“真实”服务(例如RealApiClient)
  • my-plugin-mock-services - 向模型添加“模拟”服务(例如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'