我正在编写一个与外部HTTP API交互的Gradle插件。这种交互由一个类处理(让我们称之为ApiClient
)。我正在编写一些高级测试,使用Gradle TestKit来模拟使用该插件的整个构建,但我显然不希望它们真正命中API。相反,我想模拟ApiClient
并检查其方法是否已使用适当的参数调用,但我不确定如何将模拟版本实际注入插件。该插件在Gradle深处的某个地方实例化,并使用其void apply(Project project)
方法应用于正在执行的项目,因此似乎没有方法可以注入MockApiClient
对象。
也许一种方法是手动实例化Project
,apply()
插件(此时,我可以注入模拟对象,因为我可以控制插件实例化),然后以编程方式在项目上执行任务,但我该怎么做呢?我已经阅读了Gradle API文档,但没有看到明显的方法。
最糟糕的解决方案是通过插件扩展配置传入debug
标志,插件将使用该配置来确定它是否应使用真实ApiClient
或模拟(会打印一些容易grep-able的消息到STDOUT)。但这并不理想,因为它比检查实际传递给ApiClient
方法的参数更模糊。
答案 0 :(得分:1)
也许您可以将插件分成几个不同的插件
my-plugin-common
- 所有常见的东西my-plugin-real-services
- 向模型添加“真实”服务(例如RealApiClient)my-plugin-mock-services
- 向模型添加“模拟”服务(例如MockApiClient)my-plugin
- 适用my-plugin-real-services
和my-plugin-common
my-plugin-mock
- 适用my-plugin-mock-services
和my-plugin-common
在现实世界中,人们只会apply: 'my-plugin'
对于测试,您可以apply: 'my-plugin-mock'