我正在编写一个与外部 HTTP API 交互的 Gradle 插件。此交互由单个类处理(我们称之为 ApiClient
)。我正在编写一些使用 Gradle TestKit 来模拟使用该插件的整个构建的高级测试,但我显然不希望它们实际访问 API。相反,我想模拟 ApiClient
并检查其方法是否已使用适当的参数调用,但我不确定如何将模拟版本实际注入(inject)插件。该插件在 Gradle 的某个深处实例化,并使用其 void apply(Project project)
方法应用于正在执行的项目,因此似乎没有办法注入(inject) MockApiClient
对象。
也许一种方法是手动实例化一个 Project
,apply()
插件到它(此时,我可以注入(inject)模拟对象,因为我可以控制插件实例化),然后以编程方式在项目上执行任务,但我该怎么做?我已阅读 Gradle API 文档,但没有看到明显的方法。
最坏的解决方案是通过插件扩展配置传递一个调试
标志,然后插件将使用它来确定它是否应该使用真正的ApiClient
或模拟(它会将一些易于 grep 的消息打印到 STDOUT)。不过,这并不理想,因为它比检查实际传递给 ApiClient
方法的参数更加模糊。
最佳答案
也许你可以把你的插件分成几个不同的插件
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'
要进行测试,您可以应用:'my-plugin-mock'
关于unit-testing - 测试时模拟 Gradle 插件使用的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45216315/