首页 > 解决方案 > Spock交互验证忽略对Mock方法的调用

问题描述

以下 Spock 测试未能不计算对 Mock 方法的调用:

def setup() {
    mojo = new PactCreateVersionTagMojo()
    mojo.pactBrokerUrl = 'http://broker:1234'
    mojo.pacticipant = 'test'
    mojo.pacticipantVersion = '1234'
    mojo.tag = 'testTag'
}

def 'calls pact broker client with mandatory arguments'() {
    given:
    mojo.brokerClient = Mock(PactBrokerClient)

    when:
    mojo.execute()

    then:
    notThrown(MojoExecutionException)
    1 * mojo.brokerClient.createVersionTag(
            'test', '1234', 'testTag')
}

你可以在这里找到它。

删除参数验证代码的 SUT 代码是:

class PactCreateVersionTagMojo : PactBaseMojo() {

  override fun execute() {
    ...
    createVersionTag()
  } 

private fun createVersionTag() =
      brokerClient!!.createVersionTag(pacticipant!!, pacticipantVersion.orEmpty(), tag.orEmpty())

你可以在这里找到它。

错误如下:

在此处输入图像描述

我在同一个项目上有一个非常相似的例子,它通过得很好:

 def 'passes optional parameters to the pact broker client'() {
    given:
    mojo.latest = 'true'
    mojo.to = 'prod'
    mojo.brokerClient = Mock(PactBrokerClient)

    when:
    mojo.execute()

    then:
    notThrown(MojoExecutionException)
    1 * mojo.brokerClient.canIDeploy('test', '1234',
      new Latest.UseLatest(true), 'prod') >> new CanIDeployResult(true, '', '')
  }

override fun execute() {
    ...

    val result = brokerClient!!.canIDeploy(pacticipant!!, pacticipantVersion.orEmpty(), latest, to)
}

您可以在此处找到上面的测试,并在此处找到SUT 。

我已经调查了测试期间发生的呼叫,并且看起来符合预期。此外,我尝试使用通配符参数约束创建验证,但它仍然不起作用。

在我看来,我的测试配置错误,但我无法发现通过的测试和失败的测试之间的区别。

标签: unit-testingkotlingroovytddspock

解决方案


fun createVersionTag(..)看起来像这样:

  fun createVersionTag(
      pacticipant: String,
      pacticipantVersion: String,
      tag: String) {
  }

我不会说 Kotlin,但我认为你应该使用open该方法,因为否则它是最终的,这意味着它不能被子类覆盖,因此不能被传统方法模拟或存根。这也是与 的区别open fun canIDeploy(..)


推荐阅读