【问题标题】:How do I verify method is invoked in the correct order among mock objects in Spock?如何验证在 Spock 中的模拟对象之间以正确的顺序调用方法?
【发布时间】:2016-11-26 12:58:10
【问题描述】:

在我的单元测试中,我有 2 个 Mock 对象,我们称它们为 Book bookShelf shelf。我想确保repair() 方法如果book 被我正在测试的代码首先调用,然后再通过putBack(Book) 类的putBack(Book) 方法放回shelf

这里有一个简单的说明:

def "Organize damaged books"() {

    given:
    Book book = Mock(Book)
    Shelf shelf = Mock(Shelf)

    when:
    library.returnDamaged(book)

    then:
    1 * book.repair()
    1 * shelf.putBack(book)

}

即使在returnDamaged 方法中,我在book.repair() 之前先调用shelf.putBack(),上面的测试也会通过。我试着做:

1 * shelf.putBack(book) >> {
    1 * book.repair()
}

但无论哪个先到,测试仍然通过。

【问题讨论】:

  • 你确定shelf.putBack()在书没有修复的时候抛出异常吗?
  • 货架没有必要这样做。

标签: unit-testing groovy mocking spock


【解决方案1】:

来自 Spock 在 Interaction Based Testing 上的文档:

为了避免过度规范,Spock 默认允许任何调用顺序,前提是最终满足指定的交互......在调用顺序很重要的情况下,您可以通过将交互拆分为多个 then: 块来强制执行顺序。

因此,如果您想强制执行调用顺序,只需将断言拆分为多个 then 块:

then:
1 * book.repair()

then:
1 * shelf.putBack(book)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    相关资源
    最近更新 更多