使用 Spock 进行单元测试的调用太少

问题描述 投票:0回答:0

第一次使用 Spock(对 Groovy 的了解有限),我怀疑我正在使用 Spock “一个巨大的陷阱”

同一方法调用的模拟和存根必须在同一交互中发生。

但我不太明白我的示例如何匹配其他问题(例如123)——所有这些都涉及返回值的方法,其中有问题的方法在

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")}
        }
    }
}

但是这个总是通过的,虽然验证错了

unit-testing gradle groovy mocking spock
© www.soinside.com 2019 - 2024. All rights reserved.