第一次使用 Spock(对 Groovy 的了解有限),我怀疑我正在使用 Spock “一个巨大的陷阱”:
同一方法调用的模拟和存根必须在同一交互中发生。
但我不太明白我的示例如何匹配其他问题(例如1、2、3)——所有这些都涉及返回值的方法,其中有问题的方法在
given
代码然后在 then
中验证。我的代码正在验证void
方法。
这是我要测试的代码:
package com.company
import app.cash.licensee.LicenseeExtension
import app.cash.licensee.LicenseePlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
class ThirdPartyLicensesCheckPlugin implements Plugin<Project> {
@Override
void apply(final Project project) {
project.pluginManager.apply(LicenseePlugin)
def licenseeExtension = project.extensions.findByType(LicenseeExtension)
project.pluginManager.withPlugin("app.cash.licensee") {
licenseeExtension.ignoreDependencies("com.company", "common-utils") {
because "internal project"
}
}
}
}
我想验证被许可人插件是否已正确应用和配置。
这是我的测试代码:
package com.company
import app.cash.licensee.LicenseeExtension
import app.cash.licensee.LicenseePlugin
import org.gradle.api.Project
import org.gradle.api.plugins.ExtensionContainer
import org.gradle.api.plugins.PluginManager
import spock.lang.Specification
class ThirdPartyLicensesCheckPluginTest extends Specification {
private ThirdPartyLicensesCheckPlugin plugin
// Class dependencies
// Mocks for tests
private Project project
private PluginManager pluginManager
private LicenseeExtension licenseeExtension
def setup() {
plugin = new ThirdPartyLicensesCheckPlugin()
project = Mock(Project)
pluginManager = Mock(PluginManager)
project.pluginManager >> pluginManager
licenseeExtension = Mock(LicenseeExtension)
project.extensions >> Mock(ExtensionContainer) {
findByType(LicenseeExtension) >> licenseeExtension
}
}
def "the cashapp/licensee plugin is applied to the project"() {
given: "a Gradle project"
when: "this plugin is applied"
plugin.apply(project)
then: "the cashapp/licensee plugin is applied"
1 * pluginManager.apply(LicenseePlugin)
1 * pluginManager.withPlugin("app.cash.licensee", _)
1 * licenseeExtension.ignoreDependencies("com.company", "common-utils") { because("internal project")}
}
}
我得到的失败是:
Too few invocations for:
1 * licenseeExtension.ignoreDependencies("com.company", "common-utils") { because("internal project")} (0 invocations)
Unmatched invocations (ordered by similarity):
None
我尝试在
withPlugin
检查的同时验证action参数,如下:
package com.company
import app.cash.licensee.LicenseeExtension
import app.cash.licensee.LicenseePlugin
import org.gradle.api.Project
import org.gradle.api.plugins.ExtensionContainer
import org.gradle.api.plugins.PluginManager
import spock.lang.Specification
class ThirdPartyLicensesCheckPluginTest extends Specification {
private ThirdPartyLicensesCheckPlugin plugin
// Class dependencies
// Mocks for tests
private Project project
private PluginManager pluginManager
private LicenseeExtension licenseeExtension
def setup() {
plugin = new ThirdPartyLicensesCheckPlugin()
project = Mock(Project)
pluginManager = Mock(PluginManager)
project.pluginManager >> pluginManager
licenseeExtension = Mock(LicenseeExtension)
project.extensions >> Mock(ExtensionContainer) {
findByType(LicenseeExtension) >> licenseeExtension
}
}
def "the cashapp/licensee plugin is applied to the project"() {
given: "a Gradle project"
when: "this plugin is applied"
plugin.apply(project)
then: "the cashapp/licensee plugin is applied"
1 * pluginManager.apply(LicenseePlugin)
1 * pluginManager.withPlugin("app.cash.licensee") {
licenseeExtension.ignoreDependencies("wrong.group", "incorrect-project") { because("the wrong reason")}
}
}
}
但是这个总是通过的,虽然验证错了