【问题标题】:What does it mean by _._ in Groovy/SpockGroovy/Spock 中的 _._ 是什么意思
【发布时间】:2014-09-03 17:13:16
【问题描述】:

我在一些 Spock Specs 的源代码中看到了_._。有谁知道这是什么意思?

例如,

def "test something"() {
    given:
    someClass = Mock(SomeClass)

    and:
    1 * someClass.someMethod() >> returnSomething
    0 * _._

    when:
    String str = someClass.someMethod().toString()

    then:
    str == 'returnedValue'
}

【问题讨论】:

标签: groovy spock


【解决方案1】:

_ 就像一个通配符。

_.someMethod()

表示在任何模拟对象上调用的方法someMethod,同样

myDomain._

表示在myDomain 上调用的任何内容。

遵循这个逻辑_._ 意味着在任何模拟对象上调用的任何东西。如果您不想再调用任何方法,这会很有用:

0 * _._

补充阅读

您应该阅读the docs,了解更多关于_ 可用于哪些方面的信息。

【讨论】:

  • 哦,感谢您的快速回复。在我提供的示例中,我们为模拟对象的方法定义了所需的行为。它预计会被调用一次,因此1 *。但是下一行有_._。这是否意味着0 * _._ 意味着不调用任何其他类的其他方法?
  • 0 * _._ 就是你写的。一些开发人员在测试方法的最后添加它以确保没有其他交互发生。这不是一个好习惯。
  • 因为当您以这种方式开发测试时,它们将得到“修复”。例如。重构和引入代码更改很困难,因为您引入了在编写测试时没有考虑到的新交互 - 尽管合同仍然保留,但结果还是失败了。
  • 0 * _._ 可以缩写为0 * _。详细解释可以在docs.spockframework.org找到。
  • @SvenDöring 我认为这是上下文相关的。我尽量避免交互检查,因为它会使测试变得脆弱,但我同意你的观点。我想成本与价值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 2015-05-04
  • 2011-10-31
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
相关资源
最近更新 更多