【问题标题】:Meaning of closure in then clause in spockspock中then子句中关闭的含义
【发布时间】:2018-03-17 15:48:53
【问题描述】:

我们正在使用 Spock 编写单元测试用例,我无法理解后面的代码 sn-p 修改声明的部分,

then:
1 * service.fraudMigrationOnboardingService.onboard(_) >> 
    {merchantId ->   successCallBack.call(response)}

上面的代码是什么意思。

【问题讨论】:

  • 欢迎来到 SO。请学习如何提问,不要让喜欢帮助你的人猜测实际情况。您应该始终提供MCVE(请阅读文章!)。这是您的免费拍摄,无论如何我都会回答。

标签: unit-testing mocking spock stubbing


【解决方案1】:

由于您的问题缺乏细节,我必须对您的测试进行推测和有根据的猜测。 :-/

  • 所以你有一个service 和一个成员或getter fraudMigrationOnboardingService

  • fraudMigrationOnboardingService 有一个方法 onboard 采用单个参数。

  • 显然fraudMigrationOnboardingService 是一个模拟或间谍,这就是为什么您可以在其上检查1 * ... 之类的交互。

  • 编写此测试的开发人员,看起来你太羞于询问它的含义或谁离开了你的公司,希望在调用方法 onboard(_) 时发生一些特定的事情(可能是由service) 测试期间:回调方法调用。因此,她声明了方法存根{ merchantId -> successCallBack.call(response) } 来替代onboard(_) 在这种情况下通常会做的事情。在间谍中它会执行原始方法,在模拟中它什么都不会。但显然这不是期望的行为,可能是因为测试依赖于以后的不同行为。

总的来说,我认为应该重构一个难以阅读的测试,但无论如何,我在这里复制你的情况:

package de.scrum_master.stackoverflow

import spock.lang.Specification

class DummyTest extends Specification {
  static class Service {
    FraudMigrationOnboardingService fraudMigrationOnboardingService

    void doSomething(String name) {
      println "Doing something"
      fraudMigrationOnboardingService.onboard(name)
    }
  }

  static class FraudMigrationOnboardingService {
    void onboard(String name) {
      println "On-boarding $name"
    }
  }

  static class SuccessCallBack {
    void call(int httpResponse) {
      println "Callback HTTP response = $httpResponse"
    }
  }

  def "Some service test"() {
    given:
    def onboardingService = Mock(FraudMigrationOnboardingService)
    def service = new Service(fraudMigrationOnboardingService: onboardingService)
    def successCallBack = new SuccessCallBack()
    def response = 200

    when:
    service.doSomething("ACME Inc.")

    then:
    1 * service.fraudMigrationOnboardingService.onboard(_) >>
      { merchantId -> successCallBack.call(response) }
  }
}

控制台日志显示:

Doing something
Callback HTTP response = 200

如果你注释掉>> { merchantId -> successCallBack.call(response) },它只会打印出来

Doing something

对于模拟,如果您还将Mock(FraudMigrationOnboardingService) 更改为Spy(FraudMigrationOnboardingService),它将打印出来

Doing something
On-boarding ACME Inc.

更新:也许你还不明白闭包是什么意思,我不确定。所以我会再解释一下:正如我所说,它只是onboard(String) 方法的一个存根。方法参数映射到merchantId,但未在存根方法中使用。而是触发回调。

【讨论】:

  • 用有限的细节 kriegaex 很好地回答了这个问题
猜你喜欢
  • 2013-02-19
  • 2021-06-29
  • 1970-01-01
  • 2020-08-03
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
相关资源
最近更新 更多