Unit testing 我如何在Spock中的模拟对象中验证方法是按正确的顺序调用的?

Unit testing 我如何在Spock中的模拟对象中验证方法是按正确的顺序调用的?,unit-testing,groovy,mocking,spock,Unit Testing,Groovy,Mocking,Spock,在我的单元测试中,我有两个模拟对象,让我们称它们为Book和Shelf-Shelf。我想确保repair()方法,如果book在通过shelf类的putBack(book)方法放回shelf之前首先被我正在测试的代码段调用 下面是一个快速说明: def "Organize damaged books"() { given: Book book = Mock(Book) Shelf shelf = Mock(Shelf) when: library.re

在我的单元测试中,我有两个模拟对象,让我们称它们为
Book
Shelf-Shelf
。我想确保
repair()
方法,如果
book
在通过
shelf
类的
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)

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

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

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

来自斯波克关于以下内容的文档:

为了避免过度规范,Spock默认允许任何调用顺序,前提是最终满足指定的交互……在调用顺序重要的情况下,您可以通过将交互拆分为多个
然后:
块来施加顺序

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

then:
1 * book.repair()

then:
1 * shelf.putBack(book)

根据斯波克关于以下方面的文件:

为了避免过度规范,Spock默认允许任何调用顺序,前提是最终满足指定的交互……在调用顺序重要的情况下,您可以通过将交互拆分为多个
然后:
块来施加顺序

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

then:
1 * book.repair()

then:
1 * shelf.putBack(book)

您确定图书未修复时,
shelf.putBack()
会引发异常吗?书架没有必要这样做。您确定图书未修复时,
shelf.putBack()
会引发异常吗?书架没有必要这样做。